2

我有一个 Questions 模型,就像 StackOverflow 一样,每个问题都可以由用户使用多个描述性标签进行标记。

我要决定的是是否有必要将与问题关联的标签存储在数据库中的单独表中。

或者我可以将标签存储为问题表的单个字段作为空格分隔的字符串列表吗?

我不确定哪个更有意义 - 有什么好的理由来分离数据吗?

4

4 回答 4

3

将标签分离到它们自己的表格中,再加上一个在标签和问题之间具有多对多关系的表格,这就是在关系土地广告“正常形式”中所熟知的。它使执行任务变得更容易和更快,例如使用特定标签标记所有问题、查找最受欢迎的标签等。

(以防万一你不知道——“多:多关系”是一个只有两列的表[一个外键进入标签,一个进入问题],没有唯一性约束)。

于 2009-06-13T22:20:49.037 回答
3

对多值属性使用逗号分隔的字符串是另一种 SQL 反模式。:-)

  • 字符串需要多长?换一种说法:给定条目可以有多少个标签?(这取决于各个标签的长度。)

  • 你如何解释包含分隔符的字符串?如果您当前用作分隔符的字符成为标签中的合法字符怎么办?

  • 如何在 SQL 的列表中插入或删除元素?(您必须将整个列表获取到应用程序中,分解列表,过滤它,然后将其重新发布到数据库。)

  • 你怎么能像COUNT(*)在 SQL 中那样进行聚合?

  • 您如何有效地搜索共享给定标签的所有条目?(您必须使用昂贵的模式匹配查询。)

解决方案是使用单独的表格,正如该线程上的大多数其他人所建议的那样。

于 2009-06-13T22:23:34.380 回答
1

我会将问题放在 1 个表中,将标签放在 1 个表中,并有一个单独的表将标签连接到问题。这将是构建该数据库的最佳方式。它使所有标签保持一致并大大减少了冗余。

通过像这样分离数据,您可以确保搜索特定标签将带回相同的项目。您不必担心标签在所有问题中是否拼写相同。此外,您可以通过这种方式更轻松地限制标签选项。

于 2009-06-13T22:19:40.537 回答
0

您绝对应该将标签存储在单独的表中,这使一切变得更容易,这就是“关系”数据库的全部理念。

于 2009-06-13T22:19:54.170 回答