Database 三元关系和二元关系哪一个是最好的选择?

Database 三元关系和二元关系哪一个是最好的选择?,database,database-design,Database,Database Design,我举一个简单的例子。我有电影桌,电影里有导演和演员。在我的数据库中,一部电影可以有一个或多个导演和一个或多个演员。此外,我还有一个表Persons,其中包含人员的信息。所以一个人可以在电影中扮演不同的角色,我有其他表,有可能的角色,表角色 在很多情况下,我会有兴趣了解电影的导演或演员,这样我就可以用两种主要的方式来调整表格 第一种选择:三元关系: Movies(IDMovie, ...) Persons(IDPerson, ...) Roles(IDRol,...) MoviesPersons(

我举一个简单的例子。我有电影桌,电影里有导演和演员。在我的数据库中,一部电影可以有一个或多个导演和一个或多个演员。此外,我还有一个表Persons,其中包含人员的信息。所以一个人可以在电影中扮演不同的角色,我有其他表,有可能的角色,表角色

在很多情况下,我会有兴趣了解电影的导演或演员,这样我就可以用两种主要的方式来调整表格

第一种选择:三元关系:

Movies(IDMovie, ...)
Persons(IDPerson, ...)
Roles(IDRol,...)
MoviesPersons(IDMovie, IDPerson, IDRol...)
在这种情况下,我使用三元关系

第二种选择是:

MoviesDirectors(IDMovie, IDPerson,...)
MoviesActors(IDMovie, IDPerson,...)
在这种情况下,我可以从关系表中推断rol

哪一个是最好的选择

谢谢

编辑:如果我使用两个二元关系的选项,如果将来,如果我想拥有配乐的编曲者,我需要创建一个新的表和关系,但是,使用三元关系,我不需要做任何事情,只需要在表角色中添加一个新的rol和其他任何事情

在性能上,两个二元关系比一个三元关系更好吗

谢谢

哪一个是最好的选择

您基本上回答了自己的问题—如果您希望在未来灵活地添加新角色,而不改变数据库的结构,那么三元关系就是一条出路

我会考虑单独的二元关系,如果它们每个都需要有不同的字段或约束(从你的描述中看不到)。

在性能上,两个二元关系比一个三元关系更好吗

由于表示三元关系的表需要物理存储角色标识符(与从表名本身推断角色的二元关系相反),因此缓存使用情况会稍差一些

但是,通过仔细排序复合PK中的字段,可以使三元关系更适合某些类型的查询。例如,PK:
{IDMovie,IDRol,IDPerson}
可以有效地支持以下查询:

  • 哪些人参与过给定的电影?(X)
  • 哪些人在给定的角色中为给定的电影工作过
如果您在:
{IDPerson,IDRol,IDMovie}
上创建索引,您还可以高效地查询:

  • 指定人员曾拍摄过哪些电影?(X)
  • 给定的人在给定的角色中拍摄了哪些电影

(十) 对于单独的二进制关系,您需要查询每个连接表。这当然不是两个表的问题,但随着表数量的增加(当然是从维护甚至从性能角度来看),可能会变成一个表

哪一个是最好的选择

您基本上回答了自己的问题—如果您希望在未来灵活地添加新角色,而不改变数据库的结构,那么三元关系就是一条出路

我会考虑单独的二元关系,如果它们每个都需要有不同的字段或约束(从你的描述中看不到)。

在性能上,两个二元关系比一个三元关系更好吗

由于表示三元关系的表需要物理存储角色标识符(与从表名本身推断角色的二元关系相反),因此缓存使用情况会稍差一些

但是,通过仔细排序复合PK中的字段,可以使三元关系更适合某些类型的查询。例如,PK:
{IDMovie,IDRol,IDPerson}
可以有效地支持以下查询:

  • 哪些人参与过给定的电影?(X)
  • 哪些人在给定的角色中为给定的电影工作过
如果您在:
{IDPerson,IDRol,IDMovie}
上创建索引,您还可以高效地查询:

  • 指定人员曾拍摄过哪些电影?(X)
  • 给定的人在给定的角色中拍摄了哪些电影

(十) 对于单独的二进制关系,您需要查询每个连接表。这当然不是两个表的问题,但随着表数量的增加(当然是从维护甚至从性能角度来看),可能会变成一个表