我正在尝试构建一个小系统,将特定标签分配给某个项目,或者确定一个人。所以,我有一个人员列表和一个标签列表。我需要为每个人分配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设计对于标记系统很常见,但它在我的情况下是否相关?
感谢您的帮助。
答案 0 :(得分:3)
如果您想确保没有任何重复项并且能够向某人添加N
标签,那么要正确实施规范化设计,您需要使用第三个表来链接{{每个tags
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);
是的,你会在那里得到一些重复,但无论如何它们都是短弦的,它应该真的有所作为。