使用逗号分隔值或分隔表标记类?

时间:2012-10-13 11:36:58

标签: php sql join csv tags

我需要在我的某个网站上添加标签系统。

现在我正在编写一些代码:

tags_table

CREATE TABLE `tags_table` (
`id` int(15) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`seo_url` varchar(50) NOT NULL,
PRIMARY KEY (`id`)

files_table有“tags”字段[varchar(250)]

当我添加新标签时:

  • 我列出了tags_table中的所有标签,并选择了我想要的标签
  • 我将标签名称保存到files_table.tags - >逗号分隔值

这样可以更容易地显示文件标签。

当我编辑文件时: - 选择/取消选择标签并再次保存。

具有不同表格的方法II:

  • 我知道我可以像tags_files一样制作分隔表并放入tag_id和file_id

但是当我编辑文件时,我如何检查为该文件添加或删除了哪些标签?

什么更有效?

字段或不同表中的逗号分隔值?

此外,当我编辑标签名称或删除标签时,也应对所有文件进行更改。

2 个答案:

答案 0 :(得分:2)

请勿使用逗号分隔值。它们的查询速度往往较慢。一个例外可能是您使用FULLTEXT索引和使用MySQL的MATCH,但随后您将自己绑定到特定的DBMS 特定的存储引擎(MyISAM)。

如果您有一个带标签的单独表格和一个将标签ID链接到文件的链接表,您将拥有以下优势:

  • 删除标记非常简单,只需从链接表中删除具有该ID的所有记录,然后删除标记记录。
  • 重命名代码只是一次更新。
  • 您可以轻松查询可用标记列表,并快速计算以查看其使用频率。
  • 参照完整性(外键),阻止您删除仍在使用的标记。
  • 比使用“LIKE”或其他东西查找与标记匹配的文件更快的查询。
  • 可能还有更多。

答案 1 :(得分:0)

根据您的要求,您需要:

  1. 对所有文件进行更改
  2. 效率
  3. 我强烈建议使用单独的表来存储tags_files,因为您只需在文件中添加或删除标记,但在tags_files表中删除或添加新条目。

    以逗号分隔的方法不好,原因如下:

    1. 对于每个更改,您将编辑文件标记中的行。
    2. 搜索将更加困难,因为您将无法利用MySQL搜索功能,并且您将被迫使用可能效率不高的字符串搜索。