我正在构建MySQL数据库的模式。我有一个名为'entry'的表(超类型)。条目可以是“照片”,“论文”或“视频”(子类型)。每个子类型都有不同的属性/列。
我当前的设计需要一个条目表,以及三个子类型中的每一个的单独表格。
子类型通过外键访问条目表的id attribut中的'entries'中的记录。我的问题是,如何修改此设计以限制条目仅与一种类型的子类型相关联。目前,多个子类型可以与相同的条目记录相关联。
答案 0 :(得分:1)
我不完全确定这是最好的方法,但这里有一个选项:
CREATE TABLE `entries` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`type` enum('photo','essay','video') NOT NULL DEFAULT 'photo',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
我的想法是你在每个名字的条目表中只强制执行一个条目,因此UNIQUE KEY和类型enum实质上会告诉你要加入哪个表。
这可能完全不合适,具体取决于您想要如何使用/从表中选择数据,请注意。
答案 1 :(得分:1)
您无法在SQL中以声明方式轻松执行此操作。你想要做的是在一个主密钥上放置一个CONSTRAINT,这个主密钥在密钥必须存在于entries
的所有四个表中共享(没关系,它是一个主密钥)并且它不能存在于其他两个表的 中。第二部分在SQL中没有相应的约束类型。
你基本上被TRIGGER困住了。 (您可以在某些其他引擎中使用包含子查询的CHECK CONSTRAINT执行此操作,但我认为MySQL根本不支持CHECK CONSTRAINTs,并且某些引擎在查看当前行之外不会看到评估CHECK CONSTRAINT)。