我需要实现一个类似这样的标记系统: -
每个用户都可以根据他的教育进行标记。 (标签是:小学,中学,高中)这些标签属于“教育”的范畴。同样,用户也可能被标记为他的兴趣(板球,足球,摇滚音乐,流行音乐......)板球和足球来自“体育”,摇滚音乐和流行音乐属于“音乐”。
目前的设计是:
User Userid TagID TagName UserId TagID
=========== ============= ============
1 User1 1 Pop 1 1
2 user2 2 Rock 1 2
3 Techno 1 5
4 Cricket 1 6
5 Football 2 1
6 Primary Scl. 2 4
7 Secondary scl 2 7
这3个主要表格允许用户和标签之间存在多对多关系。
次要表是:
(Music) (Sports) (Education)
TagID MusicID MusicType TagID SportID Sport TagID EducationID Education
======================= ==================== ============================
1 1 Pop Music 4 1 Cricket 6 1 Primary
2 2 Rock Music 5 2 Football 7 2 Secondary
3 3 Techno Music
这种结构中的问题是,如果不注意,音乐和体育都可以引用表格TagTable中的TagID。如果开发者不这样做,流行音乐和板球有可能引用相同的TagID采取必要的照顾。
如何避免这种多重引用的可能性?
注意:辅助表已用于检查标签是否属于同一个伞。这是分组标签的特征是必要的。
答案 0 :(得分:0)
看起来你需要类似的东西:
注意:标签名称在上面的模型中是全局唯一的。如果您需要使每个类别都是唯一的,只需在UNIQUE约束TAG.U1中包含TAG_CATEGORY_ID。
顺便说一下,您是否需要将用户限制为某些类别中的一个标签?例如,用户是否可以同时拥有“教育”类别中的主要和次要标签?如果你需要限制这个,你需要以不同的方式引用这样的标签(而不是“简单的”连接表USER_TAG),并且会有一些复杂性来防止混合“单个”和“多个”标签。