【问题标题】:Should I store tags in a text field or in separate table?我应该将标签存储在文本字段中还是单独的表格中?
【发布时间】:2014-05-06 06:18:02
【问题描述】:

我有一个表格,其中的行如下所示:

id : path : tags
1 : pictures/pic1.jpg : car bmw
3 : pictures/pic2.jpg : cat animal pussy
4 : pictures/pic3.png : gun

基本上它是一个画廊,我将图片的路径存储在表格中,以便我可以在网页上列出它们。

用户可以选择根据他提供的关键字搜索某些图片。因此,例如,他在搜索字段中输入“汽车枪”,然后为他提取具有这些标签之一的所有图片。 基本标签搜索:

SELECT * FROM pictures WHERE tags LIKE '%car%' OR tags LIKE '%gun%'

现在我想知道的是,存储标签的更好解决方案是什么?是上面描述的还是这个:

桌子图片:

id : path
1 : pictures/pic1.jpg
3 : pictures/pic2.jpg
4 : pictures/pic3.png

表格标签:

pic_id : tag
1 : car
1 : bmw
4 : gun
..and so on..

标签在这里存储在一个单独的表中,每个标签都有自己的行,所以在搜索过程中我将执行 JOIN 并以这种方式搜索匹配项。

哪种解决方案更好?

【问题讨论】:

  • 您可能想阅读database normalization
  • 我会选择“带有 pic_id 的表标签”,因为它更像是 SQL 变体的关系数据库。

标签: php mysql web


【解决方案1】:

关于标准化和可重用性,我建议如下:

餐桌图片:

id : path
1 : pictures/pic1.jpg
2 : pictures/pic2.jpg
3 : pictures/pic3.png

表格标签:

tag_id : tag
1 : car
2 : bmw
3 : gun

表格标签_图片:

id : tag_id : pic_id
1 : 1 : 1
2 : 2 : 1
3 : 3 : 3

【讨论】:

    【解决方案2】:

    在这些情况下,最好的方法是为每个图像的标签创建一个中间表,建立多对多关系。

    然后您将拥有三个表:一个用于存储图像及其 id 和属性,另一个用于保存标签及其 id,最后一个用于保存图像 id 和所有标签的标签 id 的表。

    【讨论】:

    • 是的,我也在考虑这个解决方案,但放弃了它,因为它需要 3 个表,我担心它会影响性能。
    • @user3240613 除非你有 100.000 行,否则你真的不需要担心性能
    • @user3240613 正如 kingkero 所说,与在另一种方法中每次必须解析每组标签时所获得的性能不足相比,行数和表数不是问题。跨度>
    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2010-12-14
    • 2010-11-29
    • 2016-05-29
    • 2013-01-19
    • 1970-01-01
    相关资源
    最近更新 更多