Внешние ключи, где они принадлежат в зависимости от отношений - PullRequest
2 голосов
/ 05 июля 2011

Я довольно много работал с базами данных ( MySQL, Oracle ), хотя обычно только DML, так как системы были ранее спроектированы.

Я работаю над проектом какединственный разработчик, отвечающий за разработку приложений и администратор БД;последнее, конечно, оказалось более проблематичным.

В любом случае - мне нужно обновить ограничения внешнего ключа и их логическое размещение в модели.Учитывая следующее:

dbc_user
    .user_id INT, Primary Key, Auto Increment
    // arbitrary columns

dbc_user_profile
    .user_id INT, Primary Key
    // arbitrary columns

Эти таблицы имеют отношение 1-к-1 .Я понимаю, что с учетом этих отношений их столбцы могут быть объединены в одну таблицу, но давайте просто оставим их отдельно.Тогда внешний ключ принадлежит таблице dbc_user_profile? 1013 *

А как насчет многие-ко-многим ?

dbc_user
    .user_id INT, Primary Key, Auto Increment

dbc_city
    .city_id INT, Primary Key, Auto Increment

dbc_user_city
    .city_id INT, Primary Key
    .user_id INT, Primary Key

Какие таблицы являются ссылочными / ссылочными таблицами?

Почему-то я не могу найти быстрый и грязный учебник по этому вопросу, который объясняет отношения.

Итак, вопрос из двух частей;

  • Может ли кто-нибудь предложить учебное пособие для полусложного человека, в котором подробно рассматриваются детали DDL в отношении внешних ключей?или;
  • Может ли кто-нибудь дать краткое изложение по 1-к-1 , 1-к-м и м-к-м отношения и ссылки на ФК?

1 Ответ

4 голосов
/ 05 июля 2011

Внешний ключ объявляется в дочерней таблице и ссылается на родительскую таблицу.

В отношении 1: 1 может показаться, что DBC_USER является родителем, а DBC_USER_PROFILE - дочерним.Таким образом, вы объявляете внешний ключ в таблице DBC_USER_PROFILE и ссылаетесь на таблицу DBC_USER.Нечто подобное (синтаксис Oracle)

CREATE TABLE dbc_user_profile (
  user_id int primary key,
  <<more columns>>
  constraint fk_user_profile_user_id foreign key (user_id)
    references dbc_user( user_id )
)

В отношении 1 к m, как правило, довольно ясно, какая таблица является родительской, а какая дочерней.Родитель имеет 1 строку для m строк в дочернем элементе.Таким образом, вы объявляете внешний ключ в дочерней таблице и ссылаетесь на родительскую таблицу.

CREATE TABLE parent (
  parent_id int primary key,
  <<additional columns>>
);

CREATE TABLE child (
  child_id int primary key,
  parent_id int references parent( parent_id ),
  <<additional columns>>
);

Для отношения m-to-m внешний ключ будет определен в таблице сопоставления и будет ссылаться на два родителя.столы.Таким образом, внешние ключи будут объявлены в таблице DBC_USER_CITY и будут ссылаться на DBC_USER и DBC_CITY.Что-то вроде

CREATE TABLE dbc_user_city (
  city_id int,
  user_id int,
  constraint pk_dbc_user_city primary key( city_id, user_id ),
  constraint fk_dbc_user_city_city_id foreign key( city_id )
    references dbc_city( city_id ),
  constraint fk_dbc_user_city_user_id foreign key( user_id )
    references dbc_user( user_id )
)

Очевидно, что синтаксис имеет тенденцию быть относительно специфичным для базы данных.В частности, для Oracle на сайте PSOUG имеется довольно полный список параметров синтаксиса.Для более общего справочника, включающего синтаксис для различных баз данных, вы можете использовать сайт w3schools .

...