数据库设计,为项目分配特定标签

时间:2012-10-28 23:40:27

标签: mysql database-design tags

我正在尝试构建一个小系统,将特定标签分配给某个项目,或者确定一个人。所以,我有一个人员列表和一个标签列表。我需要为每个人分配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个现有标签分配给现有人员。

你能给我一些关于如何实现这个的提示吗?我知道three-table设计对于标记系统很常见,但它在我的情况下是否相关?

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

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

1}}
person

为了保证唯一性,您可以使用复合主键,也可以向表中添加persons_2_tags -------------- person_id tag_id ,包括两列。

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

如果您需要在数据库级别强制实施3标记限制,则可以将第三列添加到unique index表(例如persons_2_tags),该表是tag_number的值enum的{​​{1}}并将其添加到1, 2, 3。插入逻辑需要在应用程序级别处理,但将由unique index强制执行。

答案 1 :(得分:1)

您的要求是否指定“确切”3个标签?

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

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

答案 2 :(得分:0)

我认为我可能会做Jeff O提到的三个表格设计,但是,只是为了提出另一种观点......

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

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

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