В моей схеме у меня есть общая таблица Animal
и унаследованная таблица Dog
.Перед использованием doctrine я использовал этот шаблон с унаследованным идентификатором, ссылаясь на универсальный идентификатор в качестве внешнего ключа.Я не могу воспроизвести то же самое с Doctrine, и я чувствую, что чего-то не хватает.
Схема, которую я использовал для создания, следующая:
CREATE TABLE `animal` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`color` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `dog` (
`id` INT UNSIGNED NOT NULL,
`breed` VARCHAR(40) NOT NULL,
KEY `id` (`id`)
);
ALTER TABLE `dog` ADD CONSTRAINT FOREIGN KEY (`id`) REFERENCES `animal`(`id`);
Сначала я попытался использовать бетон Doctrineнаследование, как казалось логичным ответом на эту проблему:
Вот файл YAML:
Animal:
columns:
id: { primary: true , type: integer , autoincrement: true }
color: { type: string(20) , notnull: true }
Dog:
columns:
breed: { type: string(20) , notnull: true }
inheritance:
extends: Animal
type: concrete
И полученный SQL:
CREATE TABLE `animal` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`color` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `dog` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`color` VARCHAR(20) NOT NULL,
`breed` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`)
);
Дублированиестолбца color
в порядке, но где внешний ключ?Как мне обеспечить целостность моего dog.id
с моим animal.id
?И что произойдет, если я удалю строки animal
?
Поэтому я попытался использовать простую однозначную связь:
Animal:
columns:
id: { primary: true , type: integer(10) , autoincrement: true }
color: { type: string(20) , notnull: true }
Dog:
columns:
animal_id: { primary: true , type: integer(10) }
breed: { type: string(20) , notnull: true }
relations:
AnimalRecord:
class: Animal
foreignAlias: DogRecord
type: one
foreignType: one
local: animal_id
foreign: id
Результат такой же, как указано выше (за исключением того, что столбец color
не дублируется, что является нормальным, поскольку наследование больше не используется), внешний ключ по-прежнему отсутствует.
Если я просто изменю animal_id
с PRIMARY
на UNIQUE
, внешний ключ создается от dog.animal_id
до animal.id
, но появляется новый id
с автоинкрементом.
Все это ведет себя так, как будто PRIMARY
или FOREIGN KEY
являются исключительными для столбцаи я не могу понять почему.Кроме того, это кажется мне опасным недостатком.