代码之家  ›  专栏  ›  技术社区  ›  ninu

在mySQL中存储项目列表顺序的有效方法

  •  3
  • ninu  · 技术社区  · 16 年前

    我有一个mySQL数据库,它保存了一组照片名称的数据。哦,说100张照片的名字

    表1:(照片)包含以下字段: 照片id、照片名称

    Ex数据:

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

    表2:(类别)包含以下字段: 类别标识、类别名称、类别顺序

    1 | Summer Shots | 1,2,4
    2 | Winter Shots | 2,3
    3 | All Seasons  | 1,2,3,4
    ...
    

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

    内部连接

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

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

    1 回复  |  直到 16 年前
        1
  •  6
  •   Simon Kérouack    16 年前

    在我看来,您可以使用另一个表来处理照片和类别之间的关系,其中包含字段category\u id、order\u id和photo\u id

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

    --编辑--

    表格照片'photo\u id','photo\u name'

    • category\u id是一个主键,唯一(除非您希望同一个category有不同的名称),具有自动递增功能,可能还有一个索引

    表category\u content'category\u id'、'photo\u id'、'order'

    • category\u id是指向表category的列category\u id的外键
    • photo\ id是指向表photo的列photo\ id的外键
    • 主键是类别id和顺序之间的组合主键
    • 照片id和类别id都是索引

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