связь внешнего ключа с учением о конкретном наследовании - PullRequest
1 голос
/ 12 мая 2011

В моей схеме у меня есть общая таблица 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 являются исключительными для столбцаи я не могу понять почему.Кроме того, это кажется мне опасным недостатком.

1 Ответ

1 голос
/ 16 мая 2011

вы можете перечитать документацию по конкретному наследованию: таблица животных всегда будет пустой, потому что все данные, которые вы предоставите о собаке "medor", будут храниться в таблице собак при использовании этой стратегии наследования.тип.Вот почему нет смысла создавать отношения между классами животных и собак.

Животное, если хотите, похоже на абстрактный класс.

Для меня ваша схема должна выглядеть следующим образом:

Animal:
  columns:
    id: { primary: true , type: integer(10) , autoincrement: true }
    color: { type: string(20) , notnull: true }
Dog:
  columns:
    breed: { type: string(20) , notnull: true }
...