[英]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
您不需要表2上的主鍵,只需一個唯一索引。 但是,如果您願意,可以使用諸如身份字段之類的人工密鑰。 在這種情況下,以1x1的關系,我認為這是不必要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.