Должен ли я добавлять транзитивные внешние ключи?
Простой пример: есть таблица клиентов.
create table Customers (
id integer,
constraint CustomersPK primary key (id)
)
Все остальные данные в базе данных должны ссылаться на Customer
, так, например, Orders
выглядит следующим образом:
create table Orders (
id integer,
customer integer,
constraint OrdersPK primary key (customer, id),
constraint OrdersFKCustomers foreign key (customer) references Customers (id)
)
Предположим теперь, что есть таблица, связывающая с Orders
:
create table Items (
id integer,
customer integer,
order integer,
constraint ItemsPK primary key (customer, id),
constraint ItemsFKOrders foreign key (customer, order) references Orders (customer, id)
)
Должен ли я добавить отдельный внешний ключ из Items
в Customers
...
constraint ItemsFKCustomers foreign key (customer) references Customers (id)
Вместо этого: следует добавить пунктирную линию /FK?
Изменить: Я добавил определения первичных ключей в таблицы. Я хотел бы повторить итерацию по тому, что я сделал выше: база данных в основном замалчивается клиентами, как показатель правильности /безопасности. Поэтому все первичные ключи содержат идентификатор customer
.
2 ответа
«Элемент» не должен ссылаться на «клиент» напрямую, потому что это подразумевается под «порядком» элемента. Таким образом, вам вообще не нужны столбцы «клиент» в таблице «items».
Отношение элемента к клиенту обеспечивается с помощью существующего внешнего ключа.
Если orders.id является столбцом идентификатора, рассмотрите возможность удаления items.customer alltogether.