我正在尝试为我从多个来源收集的一些统计信息实现“扩展”表格结构。
我的“父”表看起来像这样:
`test_parent` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`actions` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`)
)
我的第一个“子”表看起来像这样(最终我会为每个源都有一个子表):
`test_child` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`test_parent_id` int(11) unsigned NOT NULL,
`external_id` int(11) NOT NULL,
`external_actions` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `test_parent_id` (`test_parent_id`)
)
CONSTRAINT `test_child_ibfk_1` FOREIGN KEY (`test_parent_id`) REFERENCES `test_parent` (`id`)
所有这些在我的实现中都能正常工作(我将使用Java / Hibernate);但是,对于第一个子表,我将需要一个用于external_id和date的复合唯一键。我知道我不能在表之间使用复合唯一键。我宁愿没有一个表来存储所有统计数据,因为我收集的实际分析可能因来源而异。我会更乐于摆脱“父母”表。
还有其他方法我可以看看这个问题吗?我希望尽可能避免使用触发器来强制执行唯一性。
答案 0 :(得分:3)
如果要使用date
在子表中建立唯一约束,则需要子表中的external_id
。您也可以 让date
存在于父表中,并通过外键引用它。这将允许您将来以不同方式支持date
其他子表。
CREATE TABLE `test_parent` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`actions` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`, `date`)
);
CREATE TABLE `test_child` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`test_parent_id` int(11) unsigned NOT NULL,
`date` date NOT NULL,
`external_id` int(11) NOT NULL,
`external_actions` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `test_parent_id` (`external_id`,`date`),
CONSTRAINT `test_child_ibfk_1` FOREIGN KEY (`test_parent_id`, `date`)
REFERENCES `test_parent` (`id`,`date`)
);
答案 1 :(得分:-1)
将date
字段移动到子表并声明一个唯一键:
ALTER TABLE child ADD UNIQUE INDEX parent_date (parent_id, `date`);