Люди и организации являются хорошим примером вещей в отношениях супертип / подтип.Они не идентичны, но они не совершенно различны.Они имеют много атрибутов.И у людей, и у организаций есть адреса и номера телефонов, и люди, и организации могут быть истцами и ответчиками в судебном процессе, и как люди, так и организации могут, очевидно, иметь комментарии в вашей системе.поместите столбцы, общие для людей и организаций, в одну таблицу, скажем, «Стороны».Колонки, уникальные для людей, идут в таблице людей;столбцы, уникальные для организаций, входят в таблицу организаций.Используйте представления, по одному на каждый подтип, чтобы скрыть детали реализации;ваши клиенты используют представления, а не таблицы.
В качестве владельца ваших комментариев вы использовали бы ключ из таблицы супертипа "Стороны".(Я думаю.)
Вот упрощенный пример.
create table parties (
party_id integer not null unique,
party_type char(1) not null check (party_type in ('I', 'O')),
party_name varchar(10) not null unique,
primary key (party_id, party_type)
);
insert into parties values (1,'I', 'Mike');
insert into parties values (2,'I', 'Sherry');
insert into parties values (3,'O', 'Vandelay');
-- For "persons", a Subtype of "parties"
create table pers (
party_id integer not null unique,
party_type char(1) not null default 'I' check (party_type = 'I'),
height_inches integer not null check (height_inches between 24 and 108),
primary key (party_id),
foreign key (party_id, party_type) references parties (party_id, party_type)
);
insert into pers values (1, 'I', 72);
insert into pers values (2, 'I', 60);
-- For "organizations", a subtype of "parties"
create table org (
party_id integer not null unique,
party_type CHAR(1) not null default 'O' check (party_type = 'O'),
ein CHAR(10), -- In US, federal Employer Identification Number
primary key (party_id),
foreign key (party_id, party_type) references parties (party_id, party_type)
);
insert into org values (3, 'O', '00-0000000');
create view people as
select t1.party_id, t1.party_name, t2.height_inches
from parties t1
inner join pers t2 on (t1.party_id = t2.party_id);
create view organizations as
select t1.party_id, t1.party_name, t2.ein
from parties t1
inner join org t2 on (t1.party_id = t2.party_id);
Сделайте представление обновляемым, используя любую функцию, которую предоставляет вам dbms.(Вероятно, срабатывает.) Затем код приложения можно просто вставить в соответствующее представление.