Страница 1 из 1

Foreign Keys

Добавлено: 20 фев 2007, 12:06
bAng
Доброго времени суток!

Возник такой вопрос:
к примеру, существует БД с 3 таблицами CUSTOMERS, JURIDICAL_PERSONS, PHYSICAL_PERSONS.

В таблице CUSTOMERS есть поле, которое является внешним ключом, и должно быть связано с таблицей JURIDICAL_PERSONS или PHYSICAL_PERSONS в зависимости от того, какое значение имеет поле CUSTOMER_TYPE (BOOL) в той же таблице CUSTOMERS.

Подскажите PLZ как лучше поступить в данном случае.
Объеденить таблицы JURIDICAL_PERSONS и PHYSICAL_PERSONS нельзя.

Добавлено: 20 фев 2007, 12:27
WildSery
FK не может ссылаться сразу на две таблицы.
Сделай наоборот, пусть JURIDICAL_PERSONS и PHYSICAL_PERSONS ссылаются на CUSTOMERS.

Добавлено: 20 фев 2007, 13:47
kdv
не просто наоборот, а customers не может и не должен ссылаться на другие таблицы "персон". Именно юридические и физические "лица" должны ссылаться на customers, или вообще быть связаны с этой таблицей 1-1. Я бы посоветовал почитать что-нибудь по проектированию баз данных.

Добавлено: 20 фев 2007, 15:02
bAng
SRY я несколько непонятно описал.
Переименуем CUSTOMERS в TELEPHONE_NUMBERS
Для наглядности

Код: Выделить всё

CREATE TABLE TELEPHONE_NUMBERS
(
    ID integer,
    ABONENT_ID INTEGER NOT NULL,
    CONSTRAINT PK_TELEPHONE_NUMBERS_1 PRIMARY KEY (ID)
    
);

CREATE TABLE JURIDICAL_PERSONS
(
    ID INTEGER,
    JURIDICAL_PERSON_ID INTEGER,
    CONSTRAINT PK_JURIDICAL_PERSONS_2 PRIMARY KEY (ID),UNIQUE (JURIDICAL_PERSON_ID)
);

CREATE TABLE PHYSICAL_PERSONS
(
    ID INTEGER,
    PHYSICAL_PERSON_ID INTEGER,
    CONSTRAINT PK_PHYSICAL_PERSONS_3 PRIMARY KEY (ID), UNIQUE (PHYSICAL_PERSON_ID)
);

ALTER TABLE TELEPHONE_NUMBERS
ADD CONSTRAINT FK_JURIDICAL_PERSONS FOREIGN KEY (ABONENT_ID) REFERENCES  JURIDICAL_PERSONS (JURIDICAL_PERSON_ID),
ADD CONSTRAINT FK_PHYSICAL_PERSONS FOREIGN KEY (ABONENT_ID) REFERENCES PHYSICAL_PERSONS (PHYSICAL_PERSON_ID)
Т.Е у каждого абонента должен быть какой-то уникальный ID.
В то же время у абонента может быть несколько номеров.
Если абонент юридическое лицо, то ID должен присутствовать в таблице JURIDICAL_PERSONS , если физическое, в таблице PHYSICAL_PERSONS .
Или полюбому придется создавать промежуточную таблицу?

Добавлено: 20 фев 2007, 15:24
Dimitry Sibiryakov
bAng писал(а):Если абонент юридическое лицо, то ID должен присутствовать в таблице JURIDICAL_PERSONS , если физическое, в таблице PHYSICAL_PERSONS .
Это условие будет выполняться при любом направлении ссылки.
Подойди с другой стороны: юр.лицо это абонент?

Добавлено: 20 фев 2007, 15:27
WildSery
Ты сам ответил на свой вопрос.
Заведи таблицу АБОНЕНТЫ, на которую будут ссылаться Юр/Физ, и куда можно вынести общие для абонентов реквизиты.
А уж она будет иметь "номера".