0

我正在尝试构建一个小系统,可以将特定标签分配给一个项目,或者准确地说是一个人。所以,我有一个人员列表和一个标签列表。我需要为每个人分配 3 个特定标签(对应于这个人可能拥有的 3 种不同技能)。

简而言之,输出将如下所示:

Person 1 | webdesign, ux, jquery
Person 2 | blogging, photography, wordpress
Person 3 | graphic-design, 3d, inventor
...

目前,这些列表存储在两个不同的表中:

persons
-------
person_id
person_name

tags
-------
tag_id
tag_name

我的主要目标是避免重复并简单地将 3 个现有标签分配给现有人员。

你能给我一些关于如何实现这一点的提示吗?我知道三表设计对于标记系统很常见,但它与我的情况相关吗?

谢谢你的帮助。

4

3 回答 3

3

如果您想确保没有任何重复项并能够N为一个人添加标签,那么要正确实施规范化设计,您需要第三个表来链接tags到每个人person

persons_2_tags
--------------
person_id
tag_id

为了保证唯一性,您可以使用复合主键,也可以将 a 添加unique index到包含两列的表中。

请参阅此SQL Fiddle中的上述示例。

如果您需要在数据库级别强制执行 3 个标签限制,您可以将第三列添加到persons_2_tags表中(tag_number例如),它的enum值是 of1, 2, 3并将其添加到您的unique index. 插入逻辑需要在应用程序级别处理,但将由index.

于 2012-10-28T23:45:18.707 回答
1

您的要求是否指定“完全”3 个标签?

建议第三张表保持标准化。这是典型的多对多关系。这提供了最大的灵活性,因为您可以拥有无​​限但唯一的用户/标签对列表。

每个标签的用户表中可以有 3 列。性能会以牺牲灵活性为代价来提高。像“列出所有带有标签 = 'X' 的用户”这样的查询有点困难。如果您允许少于 3 个标签,则可能有多个空值。当然,在此设置中,您必须创建一个新列和大量代码才能扩展到三列之外。

于 2012-10-28T23:51:20.493 回答
0

我想我可能会做 Jeff O 提到的三张桌子设计,但是,只是为了呈现另一种观点......

如果您只是在谈论标签,即没有其他元数据的短字符串,我不知道您需要一个tags表格。本质上,标签本身可以是它的 id。

persons (person_id, person_name);
tags (person_id, tag);

是的,你会在那里得到一些重复,但无论如何它们都是短字符串,它应该真的有所作为。

于 2012-10-29T00:01:34.283 回答