簡體   English   中英

具有相同唯一列的表的主鍵或外鍵

[英]Primary key or foreign key for table with identical unique columns

請參閱下面的指示性架構。

表2包含不同格式的電影。 例如2D,3D,4D等

它的格式為列,結尾列為表1中的膠片ID號。

由於表1中的電影ID列是表1的主鍵,因此我相信表2中的電影ID列是外鍵。 但是,這使我在表2中沒有主鍵。

最好的做法是在這種情況下將表2保留為沒有主鍵,或者將兩個膠片ID都設置為兩個表的主鍵,還是我應該在表2中創建另一列以允許“膠片格式ID”作為我的表2個主鍵?

供視覺參考:

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key

在我看來,許多電影都采用多種格式,因此在第二張表中將filmid設為PK是錯誤的。 此外,該設計沒有規范化並且存在很大缺陷。 您應該有第三個電影類型表,即查找表。 然后,第二個表應僅包含filmid和filmtypeid,並且您可以在兩個字段的組合上創建主鍵。 這稱為聯結表。

表2就像表1的孩子一樣,是父母。 這是因為表1可以不具有表2而存在,但是表2不能不具有表1,因為它依靠膠片ID主鍵為其自身創建一組信息(不能具有不存在的膠片的2d或3d格式)。

在兩個表中回答有關將膠片ID設置為主要的問題; 不,不要這樣做。 主鍵唯一地標識一個表中的數據列,該數據列可以用另一個表中的外鍵引用。 如果它也是表2中的主鍵,則不會引用表1的數據,因為沒有關系。

如果我了解您的需求,則可以使用這兩個表:

CREATE TABLE `film` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `film_format` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `film_id` int(11) DEFAULT NULL,
  `format` enum('2D','3D','4D') CHARACTER SET latin1 DEFAULT '2D',
  PRIMARY KEY (`id`),
  KEY `fk` (`film_id`),
  CONSTRAINT `fk` FOREIGN KEY (`film_id`) REFERENCES `film` (`id`) ON DELETE SET NULL ON UPDATE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

您遇到了麻煩,因為您的表格設計違反了第一個范式 表[film,format]的每個唯一組合都應包含在表2中自己的行中。

我可以建議這種替代方法:

表格1

電影列表,具有FilmID的主鍵。

表2

電影支持的格式列表。

列:FilmID(FK),FormatID(FK)

主鍵:FilmID + FormatID的復合鍵或替代鍵

表3

潛在電影格式列表

列:FormatID,格式說明(2D,3D等)

主鍵:FormatID

您不需要表2上的主鍵,只需一個唯一索引。 但是,如果您願意,可以使用諸如身份字段之類的人工密鑰。 在這種情況下,以1x1的關系,我認為這是不必要的。

暫無
暫無

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

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