Foreign Keys

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
bAng
Сообщения: 3
Зарегистрирован: 31 янв 2007, 12:20

Foreign Keys

Сообщение bAng » 20 фев 2007, 12:06

Доброго времени суток!

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

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

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

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 20 фев 2007, 12:27

FK не может ссылаться сразу на две таблицы.
Сделай наоборот, пусть JURIDICAL_PERSONS и PHYSICAL_PERSONS ссылаются на CUSTOMERS.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 20 фев 2007, 13:47

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

bAng
Сообщения: 3
Зарегистрирован: 31 янв 2007, 12:20

Сообщение bAng » 20 фев 2007, 15:02

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 .
Или полюбому придется создавать промежуточную таблицу?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 20 фев 2007, 15:24

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

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 20 фев 2007, 15:27

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

Ответить