2

我正在尝试为我从多个来源收集的一些统计数据实现“扩展”表结构。

我的“父”表看起来像这样:

`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 和日期的复合唯一键。我知道我不能有跨表的复合唯一键。我宁愿没有一张表来存储所有统计数据,因为我收集的实际分析可能因来源而异。我会更愿意摆脱“父”表。

还有其他方法可以解决这个问题吗?如果可能的话,我希望避免使用触发器来强制执行唯一性。

4

2 回答 2

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`)
);
于 2011-10-20T14:11:51.480 回答
-1

将该字段移动date到子表并声明一个唯一键:

ALTER TABLE child ADD UNIQUE INDEX parent_date (parent_id, `date`);
于 2011-10-20T14:05:09.627 回答