【发布时间】:2011-05-28 20:33:36
【问题描述】:
我想用php和mysql创建一个简单的标签系统,以便用户可以通过表单添加一些标签。我的问题是我应该将标签保存为单个数据库列中的数组吗?例如。 “tag1,tag2,tag3”.. 或者我应该在数据库表中有单独的列,我应该在每列中保存每个标签。 我希望我的问题很清楚。 谢谢。
【问题讨论】:
我想用php和mysql创建一个简单的标签系统,以便用户可以通过表单添加一些标签。我的问题是我应该将标签保存为单个数据库列中的数组吗?例如。 “tag1,tag2,tag3”.. 或者我应该在数据库表中有单独的列,我应该在每列中保存每个标签。 我希望我的问题很清楚。 谢谢。
【问题讨论】:
我可能都不会说。在标记和被标记的对象之间使用多对多关系。例如,如果被标记的事物是一个问题,那么表格可能如下所示:
Question:
QuestionId
Title
Body
Tag:
TagId
Name
QuestionTags:
QuestionId
TagId
【讨论】:
您可以使用序列化和反序列化将关键字存储在一个字段中。更多信息在这里 http://php.net/manual/en/function.serialize.php
这样的……
$keywords = array('apple', 'pear', 'banana', 'peach');
$keywords_serialized = serialize($keywords);
$sql = INSERT INTO dbtable (keywords) VALUES ($keywords_serialized);
【讨论】:
今天也遇到了这个问题,在这里收集了一些想法,虽然这个问题不是很新,但我也会留下我的解决方案:
我认为 Klaus Byskov Hoffmann 给出的答案还不错,但我会添加它并将标签列表存储为他所说的多对多表,但也可以作为某种形式的序列化字符串(或者通过 user466764 说的序列化,或者像你自己说的那样只是一个逗号分隔的东西,可以在主表中使用 implode/explode 来处理。
是的,我知道:许多数据库完美主义者不太喜欢将相同的数据存储两次,因为它存在出现不一致的危险,但为了性能和简单性,我会这样做:
多对多表(标签表)仅用于搜索。为了提高搜索性能,我会限制对该表的访问仅限于搜索(当然我们需要在编辑标签时更新它),但永远不要仅仅为了查看/列出某处的标签而查询它。并且序列化标签列表适用于您正在查看相关文章或项目的每个地方 - 显示该项目时,您已经拥有该表,每次您想要显示该页面时都会对标签表进行另一个查询当您已经在主表中有列表时,这是不必要的。确保在更新标签时要小心,以始终在两个地方更新它们,最好通过一个同时执行这两个操作的 setter 函数,并且您不应该遇到不一致的问题。
【讨论】: