簡體   English   中英

具有兩個聯結表的表的主鍵/外鍵

[英]Primary Key/Foreign Key for a table with two junction tables

假設我有一個帶有兩個聯結表B和C的表A,如何為表A創建主鍵? 我在繪制的圖中有兩種類型的表,圓圈鍵是外鍵。

帶有連接表的圖像

圖片

取自教程MySQL主鍵中的參考:

CREATE TABLE roles(
   role_id INT AUTO_INCREMENT,
   role_name VARCHAR(50),
   PRIMARY KEY(role_id)
);

提供有關您的特定問題的信息很困難,因為其中的細節太少了。

根據您的評論“如果一個表具有兩個連接表,它是否需要兩個主鍵?” 沒有。

主鍵實際上是用於定義邏輯模型的邏輯概念(設計機制)。 主鍵是一組屬性(列),它們共同唯一標識關系(表)中每個元組(行)的每個末端。 主鍵的規則之一是每個關系只有一個。

如前所述,使用邏輯模型作為創建物理模型的設計,關系變為表,屬性變為列,主鍵可能變為唯一索引。 外鍵可能成為相關表中的索引,依此類推。

許多RDBMS允許在物理表定義中指定PRIMARY KEY。 大多數還允許在物理表上定義FOREIGN KEY。 他們對它們所做的工作可能因一個實現而異。 許多人使用PRIMARY KEY的定義來定義某種UNIQUE INDEX,以強制“必須唯一標識”表中的每條記錄。

因此,不,您的games_directors表不需要,也不需要兩個主鍵。 如果確實選擇指定PRIMARY KEY,則需要指定所有唯一標識games_directors表中記錄的列-最有可能是PRIMARY KEY (game_id, director_id)

類似地,游戲表的PRIMARY KEY (game_id)可能是PRIMARY KEY (game_id) ,導演可能是PRIMARY KEY (director_id) ,對於游戲類型, PRIMARY KEY (game_type_id)可能是PRIMARY KEY (game_type_id)

您可以使用來自games_directors表的外鍵來確保在添加記錄時,游戲表和Directors表中存在相應的Director。 在這種情況下,您的games_directors表將具有兩個外鍵關系(一個與游戲,另一個與導演)。 但是只有一個主鍵。

因此,您可能最終得到如下結果:

create table games (
     game_id integer,
     PRIMARY KEY (game_id)
  );

create table directors (
    director_id integer,
    PRIMARY KEY (director_id)
    );

CREATE TABLE games_directors (
    game_id     INTEGER NOT NULL,
    director_id INTEGER NOT NULL,
    commission_paid DECIMAL(10,2),

  PRIMARY KEY (game_id, director_id),
  FOREIGN KEY (game_id) REFERENCES games(game_id),
  FOREIGN KEY (director_id) REFERENCES directors(director_id)
);

注意:我沒有使用PostgreSql測試以上內容。 該語法應適用於大多數RDBMS,但有些語法可能需要稍作調整。

索引可用於加快對表中各個記錄的訪問。 例如,您可能想在導演名稱或導演ID上創建索引(取決於您最頻繁地訪問該表的方式)。 如果您主要使用以下相等條件訪問Director表: where director_name = 'fred'那么Director_name上的索引可能有意義。

隨着表中記錄數量的增加,索引變得越來越有用。

我希望這回答了你的問題。 :-)

您的游戲表僅需一個主鍵:它標識每個特定的游戲。 在聯結表中,主鍵由游戲主鍵和導演(或類型)主鍵組成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM