items
表中的所有项目都有一个可以从item_category
表格派生的类别。
+---------------------------------------------+
| items |
+---------------------------------------------+
| id | PK |
+--------------------+------------------------+
| item_category_id | FK(item_categories.id) |
+--------------------+------------------------+
item_category
表引用自身。我想创建一个category-> sub-category-> sub-sub-category等系统。我不知道会有多少嵌套的子类别,所以我认为我最好的选择是将该结构包含在一个表中。如果item_category_id
为NOT NULL
,则它具有父级,否则它是超级类别且没有父级。
+-------------------------------------------+
| item_categories |
+-------------------------------------------+
| id | PK |
+------------------+------------------------+
| item_category_id | FK(item_categories.id) |
+------------------+------------------------+
这就是我的问题所在。 doll_item
表是数据透视表。基本上doll
可以包含许多项目,item
可以属于许多玩偶。但它还有更多。我想确保doll
表中的每个doll_item
,其对应的item
来自一个唯一的类别。
我试图为每行item_category_id
提供item
;但是,我担心这种关系不会强制item_id
表中的item_category_id
和items
必然来自同一行。如果没有这个要求,在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) |
+-------------------------------------------------------+
由于
答案 0 :(得分:2)
我想确保对于
doll_item
表中的每个玩偶,[每个]对应的item
来自[不同]类别
使用复合UNIQUE KEY
。
我担心此关系不会强制
item_id
表中的item_category_id
和items
必须来自同一行
使用化合物FOREIGN KEY
。:
CREATE TABLE item (
id INT NOT NULL,
item_category_id INT NOT NULL,
PRIMARY KEY (id),
INDEX (id, item_category_id) -- see note below
);
CREATE TABLE doll_item (
doll_id INT NOT NULL,
item_id INT NOT NULL,
item_category_id INT NOT NULL,
PRIMARY KEY (doll_id, item_id),
UNIQUE KEY (doll_id, item_category_id),
FOREIGN KEY (item_id, item_category_id)
REFERENCES item (id, item_category_id)
);