2

我已經使用數據庫的公平位(MySQL,Oracle),但通常只有DML,因爲系統之前已經進行了設計。外鍵,它們屬於哪個關係取決於關係

我正在做一個項目作爲唯一的開發人員,並負責應用程序開發和DBA;後者當然會證明問題更多。

在任何情況下 - 我需要刷新外鍵約束,以及它們在模型中的邏輯位置。給出的下列:

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表中?

多對多

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對11至米,並M-到米關係和FK參考?

回答

4

外鍵在子表上聲明並引用父表。

在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的關係中,它通常很清楚哪個表是父項,哪個是子項。父項在子項中有m行1行。所以你在子表上聲明外鍵並引用父表。

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_USERDBC_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 site上有一個非常完整的語法選項列表。有關包含各種數據庫語法的更一般參考,可以使用w3schools site

+0

謝謝先生 - 快速和重點,雖然我會罷工w3schools;根據我的理解,他們已經導致了比他們幫助更多的誤入歧途。 – Dan