Как гарантировать уникальность, когда N таблиц имеют отношение 1: 1 с общей таблицей? - PullRequest
2 голосов
/ 11 августа 2011

Предположим, у меня есть сценарий со следующей моделью: таблица Animal, которая представляет любое животное, таблица Dog и таблица Bird, каждая из которых имеет отношение 1: 1 с таблицей Animal .

Animal

    INTEGER id (PK)
    STRING name

Птица

    INTEGER id (PK FK referencing `Animal.id`)

Собака

    INTEGER id (PK FK referencing `Animal.id`)                

(для ясности даю только ключи)

Как я могу гарантировать, что у данной строки в таблице Animal будет ТОЛЬКО одна указанная строка в таблице Dog или Bird? Сама модель это позволяет ...

Животное не может быть Dog и Bird одновременно ( не в мифологии, но это не так: P )

Было бы лучше, если бы это можно было сделать, просто поиграв с моделью, без триггеров ...

Любой совет будет оценен:)

Ответы [ 4 ]

3 голосов
/ 11 августа 2011

Это может быть то, что имел в виду @Pranay, но ответ был неполным.Добавьте столбец TYPE ко всем таблицам и затем ограничьте его следующим образом:

create table Animal (id integer, 
                     type string,
                     name string,
                     primary key (id),
                     unique (id, type)
                    );

create table Bird (id integer,
                   type string default 'BIRD' check (type='BIRD'),
                   primary key (id),
                   foreign key (id, type) references Animal (id, type)
                  );

create table Dog (id integer,
                  type string default 'DOG' check (type='DOG'),
                  primary key (id),
                  foreign key (id, type) references Animal (id, type)
                 );

См. блог Дэвида Портаса для хорошего объяснения этого.

1 голос
/ 11 августа 2011

В вашей базе данных вы можете добавить еще одну колонку в вашей таблице, как AnimalType

AnimalTable 
   Id
   AnimalType -- 1 = dog, 2= bird, 3= other
0 голосов
/ 11 августа 2011

Мне кажется, что дизайн базы данных здесь неправильный.Причина, по которой я говорю, заключается в том, что для каждого нового животного нужно создать новую таблицу.В общем случае вы хотите создать базу данных таким образом, чтобы при каждом добавлении данных схема не менялась.

Вот один из способов сделать это:
Таблицаживотные
animal_id PK
имя

Таблица animailProperties
property_id PK
имя

Table animalDecription
animail_id FK
property_id FK
property_data

Пример:

Столовые животные
1 СОБАКА
2 кошки
3 птицы

Таблица animailProperties
1 ножки
2 крыла
3 мухи

Столовое животноеОписание
1 1 4 (собачьи лапки 4)
1 2 0 (собачьи крылышки 0)
1 3 0 (собачья муха нет)
2 1 4 (кошканоги 4)
2 2 0 (крылья кошки 0)
2 3 0 (муха кошки нет)
3 1 2 (ноги птицы 2)
3 2 2 (крылья птицы 2)
3 3 1 (птица летит да)

Что-то в этом роде.Таким образом, вы можете создать любой тип свойств для каждого возможного животного.
Каждый раз, когда вам нужно создать новое животное, вы просто присваиваете ему правильные свойства.

Надеюсь, это поможет.

0 голосов
/ 11 августа 2011

Я не думаю , что это можно сделать без триггеров / ограничений , сохраняя таблицы отдельными.

...