У меня возникла необходимость работать с созданной 10 лет назад базой данный. Там я обнаружил некоторые вещи, которые мне показались немного странными (если я не прав, поправьте меня пожалуйста).
Предположим, есть сущность MainEntity, которой соответствуют по схеме 1-к-1
разнородные (т.е. различные по своей структуре) сущности AdditionalEntity1, AdditionalEntity2 и AdditionalEntity3. Я ожидал увидеть следующую схему базы данных:
Ожидаемая структура БДCREATE TABLE `main_entity` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`additional_entity_1_id` int(11) NOT NULL,
`additional_entity_2_id` int(11) NOT NULL,
`additional_entity_3_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `additional_entity_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `additional_entity_2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `additional_entity_3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
ALTER TABLE `main_entity`
ADD KEY `additional_entity_1_id` (`additional_entity_1_id`),
ADD KEY `additional_entity_2_id` (`additional_entity_2_id`),
ADD KEY `additional_entity_3_id` (`additional_entity_3_id`);
ALTER TABLE `main_entity`
ADD CONSTRAINT `main_entity_ibfk_1` FOREIGN KEY (`additional_entity_1_id`) REFERENCES `additional_entity_1` (`id`),
ADD CONSTRAINT `main_entity_ibfk_2` FOREIGN KEY (`additional_entity_2_id`) REFERENCES `additional_entity_2` (`id`),
ADD CONSTRAINT `main_entity_ibfk_3` FOREIGN KEY (`additional_entity_3_id`) REFERENCES `additional_entity_3` (`id`);
Однако я увидел вот что:
Фактическая структура БДCREATE TABLE `main_entity` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `additional_entity_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`main_entity_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `additional_entity_2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`main_entity_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `additional_entity_3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`main_entity_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
ALTER TABLE `additional_entity_1`
ADD KEY `main_entity_id` (`main_entity_id`),
ADD UNIQUE KEY `id__main_entity_id` (`id`, `main_entity_id`);
ALTER TABLE `additional_entity_2`
ADD KEY `main_entity_id` (`main_entity_id`),
ADD UNIQUE KEY `id__main_entity_id` (`id`, `main_entity_id`);
ALTER TABLE `additional_entity_3`
ADD KEY `main_entity_id` (`main_entity_id`),
ADD UNIQUE KEY `id__main_entity_id` (`id`, `main_entity_id`);
ALTER TABLE `additional_entity_1`
ADD UNIQUE KEY `main_entity_id` (`main_entity_id`);
ALTER TABLE `additional_entity_1`
ADD CONSTRAINT `additional_entity_1_ibfk_1` FOREIGN KEY (`main_entity_id`) REFERENCES `main_entity` (`id`);
ALTER TABLE `additional_entity_2`
ADD CONSTRAINT `additional_entity_2_ibfk_1` FOREIGN KEY (`main_entity_id`) REFERENCES `main_entity` (`id`);
ALTER TABLE `additional_entity_3`
ADD CONSTRAINT `additional_entity_3_ibfk_1` FOREIGN KEY (`main_entity_id`) REFERENCES `main_entity` (`id`);
Фактически на уровне кода получается одно и то же: связь один-к-одному связывает каждую из вспомогательных сущностей с главной.
Однако нельзя не заметить, что на уровне базы данных это две принципиально разные схемы.
Мои вопросы:
- Чем эти схемы отличаются? Есть ли какие-то "подводные камни" каждой их этих реализаций?
- Какую схему использовать более предпочтительно (в т.ч. с учетом использования Doctrine и Symfony3)?