在mySQL中存储订单列表的有效方法

nin*_*inu 3 mysql inner-join

我想更清洁,更有效地编码,我想知道以下问题的任何其他建议:

我有一个mySQL数据库,其中包含有关一组照片名称的数据.哦,说100张照片的名字

表1 :(照片)具有以下字段:photo_id,photo_name

Ex数据:

1 | sunshine.jpg
2 | cloudy.jpg
3 | rainy.jpg
4 | hazy.jpg
...
Run Code Online (Sandbox Code Playgroud)

表2 :(类别)具有以下字段:category_id,category_name,category_order

Ex数据:

1 | Summer Shots | 1,2,4
2 | Winter Shots | 2,3
3 | All Seasons  | 1,2,3,4
...
Run Code Online (Sandbox Code Playgroud)

通过逗号分隔值每个条目以这种方式存储照片的顺序是否有效?这是我以前见过的一种方法,但我想知道运行时是否还有其他更快的东西.

使用这种方式,我认为不可能在类别表和照片表上进行直接的INNER JOIN,以获得每个类别的所有照片的单个匹配列表.

例如:夏季拍摄 - > sunshine.jpg,cloudy.jpg,hazy.jpg因为它与1,2,4相匹配

遍历所有类别然后照片的迭代将具有O(n ^ 2)并且必须有更好/更快的方式.请教育我:)

Sim*_*ack 6

在我看来,您可以使用另一个表格来查看照片和类别之间的关系,包括字段category_id,order_id和photo_id

我认为使用起来会更简单,你就可以加入了

如果您决定使用该解决方案,我还建议您将photo_id设置为该新表中的索引.

- 编辑 -

桌子照片'photo_id','photo_name'

  • photo_id是主键,唯一,具有自动增量和可能的索引

表类别'category_id','category_name'

  • category_id是一个主键,唯一(除非您希望它可以为同一类别设置不同的名称),具有自动增量和可能的索引

table category_content'category_id','photo_id','order'

  • category_id是指向表类别列category_id的外键
  • photo_id是指向桌面照片列photo_id的外键
  • 主键是category_id和order之间的组合主键
  • photo_id和category_id都是索引

使用'index'以某种方式告诉MySQL您希望优化对索引列的研究,当您注意到许多查询在特定列上具有WHERE和/或JOIN时,通常最好将列设置为索引.此外,除非它简化某些内容,否则将多个数据组合成一个单独的数据几乎绝不是一个好主意,例外情况可能是将电话号码前缀与实际数字组合在一起以及类似的一些事情,但它们是例外情况.如果你使用文件,你在表中硬编码顺序的方式会很好,但在数据库中,你最好使用另一个表而不是使用逗号分隔符.任何问题?