Дилемма MySQL: составной уникальный ключ по таблицам - PullRequest
2 голосов
/ 20 октября 2011

Я пытаюсь реализовать структуру таблицы «расширение» для некоторых статистических данных, которые я собираю из нескольких источников.

Моя «родительская» таблица выглядит примерно так:

`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. Я знаю, что у меня не может быть составного уникального ключа в разных таблицах. Я бы предпочел не иметь одну таблицу для хранения всей статистики, потому что фактическая аналитика, которую я собираю, может сильно различаться по источникам. Я был бы более открыт для избавления от «родительской» таблицы.

Есть ли другой способ взглянуть на эту проблему? Я надеюсь избежать использования триггеров для обеспечения уникальности, если это возможно.

Ответы [ 2 ]

3 голосов
/ 20 октября 2011

Вам нужно 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`)
);
0 голосов
/ 20 октября 2011

Переместите поле date в дочернюю таблицу и объявите уникальный ключ:

ALTER TABLE child ADD UNIQUE INDEX parent_date (parent_id, `date`);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...