哪个是最好的选择,三元关系还是两个二元?

时间:2013-04-21 15:28:22

标签: database database-design

我的简单例子可以是这个。我有电影表,电影有导演和演员。在我的数据库中,电影可以有一个或多个导演和一个或多个演员。我也有一张桌子,有人的信息。所以一个人可以在电影中扮演不同的角色,我有另外一个具有正面角色的桌子,表格角色。

在很多情况下,我会有兴趣了解电影导演或演员,所以我可以通过两种主要方式来实现这些表格。

第一种选择:三元关系:

Movies(IDMovie, ...)
Persons(IDPerson, ...)
Roles(IDRol,...)
MoviesPersons(IDMovie, IDPerson, IDRol...)

在这种情况下,我使用三元关系。

第二个选项是:

MoviesDirectors(IDMovie, IDPerson,...)
MoviesActors(IDMovie, IDPerson,...)

在这种情况下,我可以从关系表中推断出rol。

哪个是最佳选择?

感谢。

编辑:如果我使用两个二元关系的选项,如果将来,如果我想拥有音轨的作曲家,我需要创建一个新的表和关系,但是,与三元关系我不要不需要做任何事情,只需在表Roles和其他任何内容中添加新的rol。

在表现上是两个二元关系而不是一个三元关系?

感谢。

1 个答案:

答案 0 :(得分:1)

  

哪个是最佳选择?

你几乎已经回答了自己的问题 - 如果你想要在未改变数据库结构的情况下灵活地添加新角色,那么三元关系就是你要走的路。

我会考虑单独的二元关系,如果它们中的每一个都需要具有不同的字段或约束(从您的描述中似乎不是这种情况)。

  

在表现上是两个二元关系而不是一个三元关系?

由于表示三元关系的表需要物理存储角色标识符(而不是从表名本身推断出角色的二进制关系),因此缓存使用率将略微更差。 / p>

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

  • 哪些人参与过这部电影?(X)
  • 哪个人以给定的角色参与过某部电影?

如果您在{IDPerson, IDRol, IDMovie}上创建索引,您还可以有效地查询:

  • 哪个电影有特定的人工作?(X)
  • 给定的人在哪个电影中扮演某个角色?

(X)使用单独的二进制关系,您需要查询每个联结表。这当然不仅仅是两个表的问题,但随着表的数量增长(当然来自维护甚至性能点),它可以成为一个。