这种标记方法有任何缺点

时间:2010-05-25 02:05:43

标签: php database mysql tags

我有一张tags

的表格
ID      tag
---     ------
1       tagt
2       tagb
3       tagz
4       tagn

在我的items表格中,我使用了序列化格式的标记,逗号分隔

ID       field1       tags
----     ------       -----
1        value1       tagt,tagb
2        value2       tagb
3        value3       tagb,tagn
4        value4

当我需要查找具有此标记的项目时,我计划反序列化标记。但我真的不知道该怎么做,如果最好在标签和项目之间设置第三个关联表。

3 个答案:

答案 0 :(得分:2)

是的,如果我是你,我会使用第三个表作为item-tag关联。搜索标记消息会更容易,更快速,您还可以强制执行不会将同一标记添加两次到数据库设计的同一消息。

答案 1 :(得分:2)

一般来说,人们试图利用关系数据库的力量来获得优势。换句话说,每次访问任何标记功能时,序列化和反序列化字符串都非常低效,而且由于其他原因设计也很差。

例如,如果({undefined)标记tagc被意外添加到tags的{​​{1}}字段,该怎么办?代码很难调试。

创建包含关联ID记录的第三个表是一个更好的选择。此外,您可以创建item表,如下所示:

taggings

并存储元数据以及每个标记。

过度依赖字符串来存储结构化数据既低效又无法维护。为了避免“串型”代码,在这些情况下进一步建模域名更好。

答案 2 :(得分:1)

为了解释您的标记方法有什么问题,我将向您展示一个类似的有缺陷的数据库:

table Students
--------------------
Id     grade          names
--     -----          -----
1      Kindergarden   timmy, james, sarah, suzie, etc...
2      1st            annie, chris, laura, etc...
3      2nd            robert, kimmy, sarah, jason, etc...

由于所有相同的原因,这是错误的。你不能对名字做任何事情。你无法统计它们,按它们过滤,甚至只返回其中一个。

如果你想在以后没想到的时候用你的标签来冷却什么呢?