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

Mysql 具有相同唯一列的表的主键或外键,mysql,sql,database,database-design,Mysql,Sql,Database,Database Design,见下面的指示性模式 table 1 table 2 -------|------- -------|-------|-------|------- Film |film ID Film ID| 3D | 4D | 2D ^primary key ^foreign key 表2包含不同格式的电

见下面的指示性模式

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key
表2包含不同格式的电影。例如2D、3D、4D等

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key
它的格式为列,结束列是表1中的胶片ID号

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key
由于表1中的“我的电影ID”列是表1的主键,因此我认为表2中的“电影ID”列是外键。但是,这使得my在表2中没有主键

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key
在本例中,将表2保留为不带主键的最佳做法是,还是将两个胶片ID都设置为两个表的主键,还是应该在表2中创建另一列,以允许使用“胶片格式ID”作为表2的主键

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key
视觉参考:

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

表2就像是表1的子对象,是父对象。这是因为表1可以在没有表2的情况下存在,但表2不能没有表1,因为它依赖胶片id主键为自己创建一组信息(不存在的胶片不能有2d或3d格式)

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

回答您关于在两个表中设置胶片id的主要问题;不,不要这样做。主键唯一地标识一个表中的一列数据,该列数据可以用另一个表中的外键引用。如果它也是表2中的主键,则不会引用表1的数据,因为没有建立任何关系。

表2中不需要主键,只需要一个唯一的索引。
table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key

但如果您愿意,您可以使用一个类似于标识字段的人工密钥。在这种情况下,在1x1关系中,我认为这是不必要的。

如果我了解您的需要,您可以使用这两个表:

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key
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

在我看来,很多电影都有多种格式,所以在第二张表中把filmid设为PK是错误的。此外,该设计未规范化且存在严重缺陷。您应该有第三个胶片类型表,即查找表。然后第二个表应该只包含filmid和filmtypeid,您可以在这两个字段的组合上创建主键。这称为连接表。

您遇到了问题,因为您的表设计违反了。[胶片,格式]的每个独特组合应包含在表2中其自己的行中

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key
我可否提出以下建议:

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

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key
电影列表,主键为FilmID

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

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key
电影支持的格式列表

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key
列:FilmID(FK)、FormatID(FK)

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key
主键:FilmID+FormatID的复合键或

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

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key
可能的电影格式列表

table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key
列:FormatID、格式说明(2D、3D等)

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

主键:FormatID

拆分这两个表的原因是什么?如果它们之间的关系是1:1?,那么5d胶片存储在哪里?因此我将其设为外键,并在表2中的film Id列中添加一个唯一约束,这是最佳做法?我认为是这样。但请记住:在这种情况下,您不需要两张桌子。您有一个1x1关系,我认为最好的方法是连接这些表。但是,这是您的决定。RDBMS中的所有表都应该有一个主键。问题只在于该密钥是自然密钥还是代理密钥。我曾试图说“它不是强制性的”,但事实并非如此。将在film_id字段上建立关系。然而,我建议用一个身份字段来做。我想你是说电影不牢固?虽然我不喜欢枚举,但这是可行的,因为您必须修改表以添加更多。我希望有一个查找表来代替电影类型。ff.id(可能)是多余的,因为剩余的列可以形成一个复合的自然键。@HLGEM我和你一样担心,但它们很有效,而且新的格式可能不会经常出现。@HLGEM公司已经修复,谢谢。。关于查找表,这取决于存在多少格式,如果它有几个选项,我建议您使用枚举,并将许多联接保存到查找表。这是众所周知的困境!:)@建议在每个表中设置行标识符。因此,将有三个表,表1将有film:filmID列,然后表2将是filmID:filmFormatID,表3将是2D:3D:4D:filmFormatID,其中每个电影的FormatID都不同,也将是表3中的主键,对于表2的两列,主键和表1 filmID将是主键?这就意味着数据库被标准化为1NF,对吗?表三是formatId,format类型。您永远不希望有二维、三维和4d列。其中的记录将是2D、3D、4D,而不是列
table 1                   table 2                                           
-------|-------           -------|-------|-------|-------
Film   |film ID           Film ID|  3D   |  4D   |  2D
        ^primary key      ^foreign key