2

У меня есть 4 таблицыключ иностранных отсылая к нескольким таблицам

A(ida, name) 
B(ida, B-specific stuff) 
C(ida, C-specific stuff) 
D(ida, D-specific stuff) 

и я хочу, чтобы другая таблица E может относиться только B или C (не D). Что я могу написать в

CREATE TABLE E 

?

+0

Что значение 'Ā'? Унаследовать от него 'B',' C' и 'D'? Нужно ли также наследовать от него «E», а описанные вами отношения вообще не связаны с наследованием, или ему нужно наследовать от «B» или «C» (или даже наоборот)? –

ответ

2

Кажется мне, что вы пытаетесь использовать какой-то супертип/подтип - в против простого вертикального разбиения. Если да, вводите дискриминатор типа.

Поскольку это общий пример (A, B, C, D ..), трудно догадаться, что с ним связано, так что вот два варианта, как мое лучшее предположение.


Вариант 1

enter image description here


Вариант 2

enter image description here

1

Вы можете использовать check ограничение для обеспечения, что D только ссылки B или C:

create table D 
    (
    id int constraint PK_D primary key, 
    idb int constraint FK_D_IDB foreign key references B(id), 
    idc int constraint FK_D_IDC foreign key references C(id), 
    constraint CHK_D_B_OR_C check 
     (
     case when idb is null then 0 else 1 end + 
     case when idc is null then 0 else 1 end = 1 
     ) 
    ); 

Live example at SQL Fiddle.

+0

, но мне бы хотелось, чтобы он относился к B или к C, а не к обоим из них (и я не думаю, что нулевой fk в каждой строке эффективен. –

+0

Лучше ли это на вашем пути или с уникальной таблицей ' A (ida, ..., где) '? Я только что сделал 2 месяца« уроков sql/mysql », и мы didn-t очень много сделали, поэтому я подумывал об этом, прежде чем спрашивать, и на сайте я делаю, я могу проверить, где должен быть B или C, а затем я могу проверить с помощью триггера, если я вставляю в E raw с D. –

+0

Триггеры - это зло, я бы держался подальше от них. ключи обычно лучше столбца типа, потому что столбец типа повторяет информацию в внешних ключах. – Andomar

Смежные вопросы