2017-01-27 111 views
0

请参见下面的指示性模式。具有相同唯一列的表的主键或外键

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

它具有的格式作为列和列端从表中的胶片ID号1

正如我的膜ID列在表1中是我的表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 
+0

分裂这两个表的原因是什么?如果它们之间的关系是1比1? –

+0

5d电影在哪里存放? – Strawberry

回答

0

表2是像一个孩子到表1中,得到了家长。这是因为表1可以在没有表2的情况下存在,但是表2不能没有表1,因为它依赖于电影ID主键来创建它自己的一组信息(不能存在不存在电影的2d或3d格式)。

要回答你关于在两张表中制作电影编号的问题;不要这样做。主键唯一标识表中可以用另一个表中的外键引用的一列数据。如果它也是表2中的主键,则不会参考表1的数据,因为没有关系。

-1

表2不需要主键,只是一个唯一的索引。 但是,如果你愿意,你可以使用一个仿真钥匙,如身份字段。在这种情况下,以1x1的关系,我认为这是不必要的。

+0

所以我把它作为一个外键,并添加一个唯一的约束到电影Id列到表二,这是最佳实践? – moglia1

+0

我这么认为。但请记住:在这种情况下,您不需要2个表格。你有1x1的关系,我认为最好的方法是加入这些表。但是,这是你的决定。 –

+0

RDBMS中的所有表应具有PRIMARY KEY。问题只是这个关键应该是一个自然的关键,还是一个替代物。 – Strawberry

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 
+0

我认为你的意思是电影不坚定?虽然我不喜欢枚举,但这会起作用,因为您必须改变表格才能添加更多内容。我宁愿有一个查找表,而不是电影类型。 – HLGEM

+0

ff.id(假定)是多余的,因为剩余的列可以形成复合自然键。 – Strawberry

+0

@HLGEM我分享你的关注,但他们*是*高效的,新的格式可能不会经常出现。 – Strawberry

1

在我看来,很多电影都在多种格式,所以这将是错误的,使filmid一个PK的第二个表。此外,该设计还没有正常化,并且存在很大的缺陷。你应该有第三个电影类型的表,这是一个查找表。然后,第二个表格应该只包含filmid和filmtypeid,并且您可以在这两个字段的组合上创建主键。这被称为联结表。

+0

因此,将有三个表,table1将有电影列:filmID然后表2将是filmID:filmFormatID和表3将2D:3D:4D:filmFormatID其中FormatID将在每部电影不同,也将是表3中的主键,表2中的主键和table1 filmID都是主键?这将意味着数据库正常化为1NF吧? – moglia1

+0

表三将是formatId格式类型。你永远不想有列2d,3d,4d。其中的记录将是2D,3D,4D而不是列 – HLGEM

0

由于您的餐桌设计违反了first normal form,您遇到了麻烦。 [膜,格式]的每个唯一组合应当包含在其自己的行于表2

可能我建议此替代:

表1

膜的列表,与主FilmID的关键。

表2

的由膜支持的格式的列表。

列:FilmID(FK),FormatID(FK)

主键:要么FilmID + FormatID的化合物键,或一个surrogate key

表3

A的潜在列表电影格式

列:格式ID,格式说明(2D,3D等)

主键:格式ID

相关问题