2012-10-13 46 views
0

我需要为我的某个网站添加标签系统。使用逗号分隔值或分隔表的标签类?

现在我编码的东西艾克这样的:

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有 “标签” 领域的varchar(250)]

当我加入新的标签:

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

这样比较容易表现出的文件标签。

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

方法II具有不同的表:

  • 我知道,我可以使分隔的表像tags_files并把TAG_ID和FILE_ID

但是,当我编辑的文件,我怎么检查添加了什么标签或删除该文件?

什么更有效?

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

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

+2

请勿使用逗号分隔列。这就打破了关系数据库的目的。去不同的表。 – itachi

回答

2

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

如果你有一个标签一个单独的表和链接标签ID的文件进行链接表,你有这些优点:

  • 删除标签是删除所有记录与ID从链接一样简单表格,然后删除标签记录。
  • 重命名标签只是一个更新。
  • 您可以轻松查询可用标签列表并快速计数以查看它使用的频率。
  • 参照完整性(外键)阻止您删除仍在使用的标记。
  • 查询速度快于使用'LIKE'查找匹配标签的文件。
  • 可能还有更多。
+0

我的问题是当我编辑文件...我无法看到我可以检查我删除了哪些标签以及添加了哪些标签。我的意思是我从tags_files中获得该文件的标签ID列表,然后删除2个标签和3个新标签,我将如何删除已删除的标签?如果我删除它们,则不会传递id。 – gtht90

+0

这与接口的实现有关。您必须记住您删除的标签的名称或标识,以便您也可以从数据库中删除它们。 – GolezTrol

0

按您的要求,您需要:

  1. 变更,必须对所有文件进行
  2. 效率

我会强烈建议使用一个单独的表,用于存储tags_files的,那么你可以简单地添加或删除文件中的标记,但删除或添加tags_files表中的新条目。

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

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