为了说明问题,我让一个例子:唯一约束(W/O触发)上的“一到多”关系
甲tag_bundle由一个或一个以上的标记。 独特的标签组合可以映射到唯一的标签块,反之亦然。
tag_bundle tag tag_bundle_relation
+---------------+ +--------+ +---------------+--------+
| tag_bundle_id | | tag_id | | tag_bundle_id | tag_id |
+---------------+ +--------+ +---------------+--------+
| 1 | | 100 | | 1 | 100 |
+---------------+ +--------+ +---------------+--------+
| 2 | | 101 | | 1 | 101 |
+---------------+ +--------+ +---------------+--------+
| 102 | | 2 | 101 |
+--------+ +---------------+--------+
| 2 | 102 |
+---------------+--------+
不能有具有正好从标签100和标签相同的组合101 不能有具有正好从标签101和标签102
同一组合的另一tag_bundle另一个tag_bundle如何确保执行SQL “同时”时的这种唯一约束! 就是防止同时将两束具有完全相同相同标签组合
添加任何表不起作用简单的唯一约束, 难道还有比触发或显式锁以外的任何解决方案。
我只想到了这样一种简单的方法:将标记组合变成字符串,并让它成为一个独特的列。
tag_bundle (unique on tags) tag tag_bundle_relation
+---------------+-----------+ +--------+ +---------------+--------+
| tag_bundle_id | tags | | tag_id | | tag_bundle_id | tag_id |
+---------------+-----------+ +--------+ +---------------+--------+
| 1 | "100,101" | | 101 | | 1 | 101 |
+---------------+-----------+ +--------+ +---------------+--------+
| 100 | | 1 | 100 |
+--------+ +---------------+--------+
但它似乎不是一个好办法:(
您是否希望允许tab_id参与多个捆绑包?例如,'tag_bundle_id = 2'有'tags =(100,200)'?超级集合/子集怎么样,'tag_bundle_id = 3是否有标签(100,101,102)'? – 2010-04-20 21:44:19
tag_bundle_id = 2允许标签=(100,200), tag_bundle_id = 3允许标签(100,101,102)。 – elgcom 2010-04-20 21:53:31
那么,是或否的子集? – MkV 2010-04-20 23:52:49