具有相同唯一列

时间:2017-01-27 17:15:05

标签: mysql sql database database-design

见下面的指示性图式。

表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

5 个答案:

答案 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的关系中,我认为这是不必要的。