见下面的指示性图式。
表2包含不同格式的电影。例如。 2D,3D,4D等
格式为列,结束列为表1中的电影ID号。
由于表1中的电影ID列是表1的主键,因此我认为表2中的电影ID列是外键。然而,这使我在表2中没有主键。
最佳做法是在此实例中保留没有主键的表2,或者将两个胶片ID都设置为两个表的主键,或者我应该在表2中创建另一个列,以允许使用"电影格式ID& #34;这将是我的表2主键?
视觉参考:
table 1 table 2
-------|------- -------|-------|-------|-------
Film |film ID Film ID| 3D | 4D | 2D
^primary key ^foreign key
答案 0 :(得分:1)
在我看来,很多电影都有多种格式,所以在第二张桌子上制作一张PK是错误的。此外,设计没有标准化和高度缺陷。你应该有第三个电影类型表,它是一个查找表。然后第二个表应该只包含filmid和filmtypeid,你可以在两个字段的组合上创建一个主键。这被称为联结表。
答案 1 :(得分:0)
表2就像你的桌子1的孩子一样,是父母。这是因为表1可以不存在表2,但表2不能没有表1,因为它依赖于电影id主键来创建自己的一组信息(你不能有2d或3d格式的不存在的电影)。
回答你关于在两张表中制作电影ID主要问题的问题;不,不要这样做。主键唯一地标识表中的数据列,该列可以使用另一个表中的外键引用。如果它也是表2中的主键,则它不会引用表1的数据,因为没有关系。
答案 2 :(得分:0)
如果我了解您的需求,您可以使用这两个表:
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
答案 3 :(得分:0)
您遇到了麻烦,因为您的表格设计违反了first normal form。 [电影,格式]的每个独特组合应该包含在表2中的各行中。
我可以建议这个替代方案:
表1
电影列表,主键为FilmID。
表2
电影支持的格式列表。
列:FilmID(FK),FormatID(FK)
主键:FilmID + FormatID的复合键或surrogate key
表3
潜在电影格式列表
列:FormatID,格式说明(2D,3D等)
主键:FormatID
答案 4 :(得分:-1)
您不需要表2上的主键,只需要一个唯一索引。 但是如果你愿意,你可以使用像身份字段这样的人工密钥。在这种情况下,在1x1的关系中,我认为这是不必要的。