【问题标题】:Efficient way to store order in mySQL for list of items在 mySQL 中为项目列表存储订单的有效方法
【发布时间】:2010-06-10 06:55:20
【问题描述】:

我想编写更简洁、更高效的代码,我想知道针对以下问题的任何其他建议:

我有一个 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,以获得每个类别所有照片的单个匹配列表。

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

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

【问题讨论】:

  • "Is it efficient to store the order of the photos in this manner per entry via comma delimited values?" 不,这是一个糟糕的解决方案。 "I wanted to know if something else is faster in run time." 结构比速度梦想更重要。学习数据库基础知识,然后才开始关注从不影响它的事物的“速度”
  • 那么请发布一些内容,告诉我如何在结构上做得更好!

标签: mysql inner-join


【解决方案1】:

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

我认为它使用起来会更简单,而且你可以加入

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

-- 编辑--

桌子照片'photo_id','photo_name'

  • photo_id 是唯一的主键,具有自动递增功能,可能还有索引

表类别'category_id'、'category_name'

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

表 category_content 'category_id','photo_id','order'

  • category_id 是指向表 category 的列 category_id 的外键
  • photo_id 是指向表 photo 的列 photo_id 的外键
  • 主键是 category_id 和 order 之间的组合主键
  • photo_id 和 category_id 都是索引

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多