如何在数据库中保存标签(关键字)?

时间:2010-12-21 14:06:17

标签: mysql tags

我想用php和mysql创建一个简单的标签系统,这样用户就可以通过表单添加几个标签。我的问题是,我应该将标签保存为单个数据库列中的数组吗?例如。 “tag1,tag2,tag3”..或者我应该在数据库表中有单独的列,我应该在每列中保存每个标记。 我希望我的问题很明确。 感谢。

3 个答案:

答案 0 :(得分:24)

我可能不会说。使用标记与被标记对象之间的多对多关系。例如,如果被标记的事物是一个问题,那么表格可能如下所示:

Question:
    QuestionId
    Title
    Body

Tag:
    TagId
    Name

QuestionTags:
    QuestionId
    TagId

答案 1 :(得分:9)

今天也遇到了这个问题,并在这里收集了一些想法,虽然这个问题不是很新,但我也会留下我的解决方案:

我认为Klaus Byskov Hoffmann给出的答案并不是很糟糕,但是我会添加并将标签列表存储为多对多表,就像他说的那样,但也作为序列化字符串某个表单(通过序列化,如user466764表示,或者只是像你自己说的逗号分隔的东西,可以用implode / explode处理)。

是的,我知道:对于许多数据库完美主义者来说,存储两次相同的数据并不是很好,因为它有可能会出现不一致的情况,但我会这样做以提高性能和简单性:

多对多表(标记表)仅用于搜索。为了提高搜索性能,我只限制对该表的访问以进行搜索(当然我们需要在编辑标签时更新它),但从不查询它只是为了在某处查看/列出标签。序列化的标签列表适用于您正在查看相关文章或项目的每个地方 - 当显示该项目时,您已经拥有该表格,每次要显示该页面时,对标记表格执行另一个查询已经在主表中列出了列表是不必要的。确保在更新标签时要小心,以便始终在两个地方更新它们,最好通过同时执行这两种操作的单个setter函数,并且不应该存在不一致的问题。

答案 2 :(得分:0)

您可以使用序列化和反序列化将关键字存储在一个字段中。更多信息在这里 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);