Должен ли я добавлять транзитивные внешние ключи?

Простой пример: есть таблица клиентов.

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.

11 голосов | спросил vektor 14 PM00000010000000331 2014, 13:01:03

2 ответа


6

Я думаю, что это оригинальная идея.

введите описание изображения здесь>> </p>

<p> Прежде всего, обратите внимание, что ПК в таблице LineItem имеет три атрибута <code>---- +: = 0 =: + ----</code>, а не только два в вашем примере. </p>

<p> Вторая вещь, которую следует отметить, - это путаница, связанная с использованием имени <code>---- +: = 1 =: + ----</code> для атрибута. </p>

<p> <code>---- +: = 2 =: + ----</code> в идеале должен быть (1,2,3 ..) для каждого клиента и <code>---- + : = 3 =: + ----</code> (1,2,3 ...) для каждого заказа. </p>

<p> Ну, это хорошо, если возможно, но требует запроса, ищущего предыдущее максимальное значение, например </p>

<pre><code>---- +: = 4 = + ----</code></pre>

<p>, который часто не является предпочтительным в средах с высокой транзакцией, поэтому обычно наблюдается, что они заменяются автоматическим приращением, в основном служащим той же цели. Верно, что этот автоинкремент теперь уникален, поэтому его можно использовать как КЛЮЧ, но вы можете рассмотреть его как необходимый компромисс для <code>---- +: = 5 =: + ----</code>. </p>

<p> Итак, с некоторым переименованием <code>---- +: = 6 =: + ----</code> и <code>---- +: = 7 =: + ----</code> -> <code>---- +: = 8 =: + ----</code>, вы можете прийти к этой модели </p>

<p> <img src =

ответил Damir Sudarevic 15 PM00000050000002431 2014, 17:40:24
2

«Элемент» не должен ссылаться на «клиент» напрямую, потому что это подразумевается под «порядком» элемента. Таким образом, вам вообще не нужны столбцы «клиент» в таблице «items».

Отношение элемента к клиенту обеспечивается с помощью существующего внешнего ключа.

Если orders.id является столбцом идентификатора, рассмотрите возможность удаления items.customer alltogether.

ответил Daniel Hutmacher 14 PM00000010000000731 2014, 13:10:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132