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

时间:2010-06-10 06:55:21

标签: mysql inner-join

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

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

表1 :(照片)包含以下字段: photo_id,photo_name

Ex数据:

1 | sunshine.jpg
2 | cloudy.jpg
3 | rainy.jpg
4 | hazy.jpg
...

表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
...

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

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

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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

- 编辑 -

table photo'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时,通常最好将列设置为索引。此外,除非它简化某些内容,否则将多个数据组合成一个单独的数据几乎绝不是一个好主意,例外情况可能是将电话号码前缀与实际数字组合在一起以及类似的一些事情,但它们是例外情况。如果你使用文件,你在表中硬编码顺序的方式会很好,但在数据库中,你最好使用另一个表而不是使用逗号分隔符。有问题吗?