【发布时间】:2015-02-24 22:05:01
【问题描述】:
items 表中的所有项目都有一个可以从item_category 表派生的类别。
+---------------------------------------------+
| items |
+---------------------------------------------+
| id | PK |
+--------------------+------------------------+
| item_category_id | FK(item_categories.id) |
+--------------------+------------------------+
item_category 表引用自身。我想创建一个类别->子类别->子子类别等系统。我不知道会有多少嵌套的子类别,所以我认为我最好的选择是将这个结构包含在一个表中。如果item_category_id 是NOT NULL,那么它有一个父类,否则它是一个超类并且没有父类。
+-------------------------------------------+
| item_categories |
+-------------------------------------------+
| id | PK |
+------------------+------------------------+
| item_category_id | FK(item_categories.id) |
+------------------+------------------------+
这就是我的问题所在。 doll_item 表是一个数据透视表。基本上,doll 可以有很多物品,item 可以属于很多娃娃。但不仅如此。我想确保对于doll_item 表中的每个doll,其对应的item 都来自一个独特的类别。
我试图在每一行中为item 拉入item_category_id;但是,我担心这种关系不会强制items 表中的item_id 和item_category_id 必须来自同一行。如果没有这个要求,在doll_item 表中添加后两行是没有意义的。
是否可以使用 MySQL 强制执行此操作?
+-------------------------------------------------------+
| doll_item |
+-------------------------------------------------------+
| doll_id | FK(dolls.id) |
+----------------------+--------------------------------+
| item_id | FK(items.id) |
+----------------------+--------------------------------+
| item_category_id | FK(items.item_category_id) |
+----------------------+--------------------------------+
| unique(doll_item.doll_id, doll_item.item_category_id) |
+-------------------------------------------------------+
谢谢
【问题讨论】:
-
澄清:您也有一个
dolls表,对吧?问题:当您说“数据透视”表时,您的意思是“多对多联接”表吗?问题:许多这样的连接表在两个id列上都有一个复合(唯一)主键,在您的情况下为(doll_id, item_id)。是否有某些原因您不能这样做,因此从items表中收集您唯一的item_category_id? -
澄清:是的,有一个
dolls表。回答:是的,我所说的“数据透视”表是指有一个多对多连接表;这是doll_item表。答:我需要一个比这更具体的约束。对于每个doll,我需要每个item_category都有一个唯一的item。为了说明这一点,假设我有一个“裤子”项目。我不想让一个娃娃身上有两种不同类型的裤子。这是一个换装游戏,所以如果一个娃娃穿着两条裤子,它会显得很奇怪。你是什么意思“因此从items表中收集你唯一的item_category_id?” -
离题但我忍不住:如果您打算允许任意深度的子类别,请考虑阅读this excellent thread。
-
谢谢!据我了解真的很有趣。尽管似乎具有邻接关系的节点可以有多个直接父节点,这对我的架构来说是个问题。还是我误解了,因为我看到面包屑的实现实际上类似于我的问题。
标签: mysql unique-constraint referential-integrity