假设我有一个父表和一个子表,其中parent_is作为外键。现在我想存储可能属于父母或孩子的照片。所以我可以在照片表中有一个parent_id和一个child_id外键:当照片属于父照片时,那么child_id外键列将为空,反之亦然。但是,我决定采用不同的设计:我现在有一个item
表,我得到parent
表主键(parent_id
)也是引用{的外键item_id
表中的{1}}列和item
表主键(child
)也作为{{1}中相同child_id
列的外键表。所以现在我的item_id
表中没有两个不同的外键(引用item
和child_id
)而只有一个(引用parent_id
):
photos
我希望到目前为止很清楚!这样可行,但现在我的问题是如果我想删除item_id
记录:我会删除CREATE TABLE `parent` (
`parent_id` int(10) unsigned NOT NULL,
`name` varchar(40) NOT NULL,
PRIMARY KEY (`parent_id`),
CONSTRAINT `parent_ibfk_1` FOREIGN KEY (`parent_id`)
REFERENCES `item` (`item_id`) ON DELETE CASCADE ON UPDATE CASCADE)
CREATE TABLE `child` (
`child_id` int(10) unsigned NOT NULL,
`name` varchar(40) NOT NULL,
PRIMARY KEY (`child_id`),
CONSTRAINT `child_ibfk_1` FOREIGN KEY (`child_id`)
REFERENCES `item` (`item_id`) ON DELETE CASCADE ON UPDATE CASCADE)
CREATE TABLE `item` (
`item_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`item_id`))
CREATE TABLE `photo` (
`photo_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`item_id` int(10)unsigned NOT NULL,
`name` varchar(40) NOT NULL,
PRIMARY KEY (`photo_id`),
CONSTRAINT `photo_ibfk_1` FOREIGN KEY (`item_id`)
REFERENCES `item` (`item_id`) ON DELETE CASCADE ON UPDATE CASCADE)
表中相应的parent
记录,该记录将自动删除{中的相应记录{1}}表感谢外键,然后外键会自动删除属于该父项的item_id
表中的记录。一切都很好,除了我将留在item
表中与刚刚删除的子记录相对应的记录。除非parent
表中的child
也是引用{{1}中相应item
的外键,否则item
表不会知道某些子记录已被删除表。我觉得我的设计错了吗?在这种情况下,推荐的设计是什么?