我正在尝试建立一个小系统,将分配特定的标签到一个项目,或一个人,准确地说。因此,我有一个人员列表和一个标记列表。我需要为每个人分配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设计在标签系统中很常见,但它与我的情况相关吗?
谢谢你的帮助。
发布于 2012-10-29 07:45:19
如果您希望确保没有任何重复项并且能够向人员添加N标签,那么为了正确地实现规范化设计,您需要第三个表来将tags链接到每个person
persons_2_tags
--------------
person_id
tag_id为了保证唯一性,您可以使用复合主键,或者向包含两列的表中添加一个unique index。
请参阅此SQL Fiddle中的上述示例。
如果需要在数据库级别强制实施3个标记的限制,可以向persons_2_tags表(例如tag_number)添加第三列,该列是一个值为1, 2, 3的enum,并将其添加到unique index中。插入逻辑需要在应用程序级别处理,但将由index强制执行。
发布于 2012-10-29 07:51:20
您的需求是否指定了“精确”3个标签?
建议第三个表保持规范化。这是一个典型的多对多关系。这提供了最大的灵活性,因为您可以拥有一个无限但唯一的用户/标记对列表。
对于每个标记,在用户表中可以有3列。性能的提高将以牺牲灵活性为代价。像"List the users with tag = 'X'“这样的查询就有点难了。如果您允许的标签少于3个,则可能会有多个空值。当然,在这个设置中,您必须创建一个新列和大量代码来扩展到超过三列。
发布于 2012-10-29 08:01:34
我想我可能会做Jeff O提到的三个表的设计,然而,只是为了呈现另一种视图……
如果您只讨论标记,即没有其他元数据的短字符串,我不知道您是否需要tags表。本质上,标签本身可以是它的id。
persons (person_id, person_name);
tags (person_id, tag);是的,你会得到一些重复,但无论如何,它们都是短字符串,这应该真的会有所不同。
https://stackoverflow.com/questions/13114180
复制相似问题