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



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

在很多情况下,我想知道电影的导演或演员,所以我可以用两种主要方式来联系这些表格。

第一个选项:三元关系:

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

在本例中,我使用了一个三元关系。

第二个选项是:

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

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

哪个是最好的选择?

谢谢。

编辑:如果我使用两个二进制关系的选项,如果在未来,如果我想有配乐的作曲家,我需要创建一个新的表和关系,然而,与三元关系我不需要做任何事情,只添加一个新的角色在表角色和其他任何东西。

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

谢谢。

哪个是最好的选择?

你基本上回答了你自己的问题——如果你想在不改变数据库结构的情况下灵活地在将来添加新角色,那么三元关系是最好的选择。

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

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

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

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

    (X)
  • 哪些人在给定的电影中担任给定的角色?

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

    (X)
  • 给定的人在给定的角色中工作过哪些电影?

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

最新更新