2010-12-21 34 views
9

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

回答

20

我可能不会说。在标签和被标签对象之间使用多对多的关系。举例来说,如果被标记的东西是一个问题,表看起来是这样的:

Question: 
    QuestionId 
    Title 
    Body 

Tag: 
    TagId 
    Name 

QuestionTags: 
    QuestionId 
    TagId 
+3

这种方式提供可扩展性并允许使用索引进行数据库优化。好答案。 – 2010-12-21 14:14:24

+0

我登陆此页面搜索关于在此类方案中更新标签列表的建议。你会怎么做? DELETE FROM QuestionTags WHERE QuestionId = 123然后INSERT INTO QuestionTags所有剩下的和新的标签?这对开发者来说似乎是最简单的,但对性能来说可能不是最好的... – Henno 2012-07-04 18:05:58

+0

@Henno我不知道我明白你的意思。你可以问一个单独的问题吗? – 2012-07-05 08:05:36

0

你可以使用序列化并unserialise的关键字存储在一个领域。这里更多的信息 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); 
8

今天跨越这个问题来了,以及与聚集在这里的一些想法,虽然问题不是很新的,我会离开我解决方案以及:

我认为答案克劳斯Byskov霍夫曼给了不错,但我会添加,并将标记列表存储为像他说的多对多表,但也作为序列化的字符串以某种形式(通过像user466764说的序列化,或者像你自己说的逗号分开的事情,这可以与我一起处理mplode/explode)在主表中。

是啊,我知道:存储相同的数据两次不能很好地与许多数据库的完美主义者接受,因为它担负着越来越不一致的危险,但我会为性能和简单做到这样:

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