ER模型:何时添加关系,何时不添加

ER model: when to add a relationship and when not to add

考虑这个 ER 设计示例。我有三个实体:

  1. 歌手
  2. 专辑
  3. 歌曲

每位歌手至少有一张专辑(根据定义),每张专辑至少有一首歌。每首歌只属于一张专辑。所以我也有两个关系:

  1. 专辑:歌手 (1-or-more:exactly-1)
  2. 歌曲:专辑(1 或更多:正好 1)

如果我想知道这首歌是谁唱的,我可以加入以专辑实体为中心的表格。

现在我的问题是:我是否还要添加歌手与歌曲之间的直接关系?我不明白它是否仅取决于用例,或者是否有严格的 rule/best 实践。如果我添加它,我会使用更多的磁盘 space 但我需要更少的内存来查询歌曲作者(我不需要连接)。

解决方案是什么?

编辑:我刚刚意识到,您每张专辑只选择一位歌手。在这种情况下,您具有三个关系:

  • 歌手 <-> 专辑
  • 歌曲 <-> 专辑
  • 歌手 <-> 歌曲

您的理解是正确的 - 您可以选择同时使用这三个,以获得更多的磁盘使用率和更快的查询。或者,您可以只选择两个,以减少磁盘使用量和降低查询速度。

这始终是个案的基础 - 如果您知道您可以表示两个表之间的关系而不丢失数据,那么速度和大小之间的选择就由您来决定了。不过,需要考虑的一个重要因素是面向未来。举例来说,将来您可能希望每张专辑有不止一位歌手。那么对于哪个歌手唱哪首歌就不再含蓄了。综合考虑,它一个数据库,因此您通常期望它又大又快。

(我假设 album:singer 和 song:album 实际上都是 1-or-more:exactly-1 因为你的 "one to many" 与你的其他描述相矛盾。)

Re 2 table正确: 你不应该同时使用这三个。 SingerSong 始终等于 (SingerAlbum JOIN SongAlbum) PROJECTed on SINGER & SONG。当 two-table 设计只涉及一个并且需要 multi-table 约束来强制 SingerSong 和其他人之间的一致性时,以需要更新多个 table 的方式使用全部 3 是多余的.

重新设计 tables: 每个 table 都有一个意义/predicate 和每个 present 行 &每一个缺席的行(适合它的)都会做出一个陈述/命题。我们选择足够的 meanings/predicates 来描述所有可能出现的情况。 (请参阅 re bases and this 重新查询和我使用 "predicate" 的其他答案。) "Redundancy" 是两行同时重叠 statements/propositions 的时候。然后我们必须更改多行,而在另一种设计中我们只能更改一行。 (或更多与更少。)我们只需要知道我们选择的 meanings/predicates 说了什么。遗憾的是,大多数信息建模方法和产品都没有解决 relationships/relations 中的 meanings/predicates,即使它们是建模的基础以及 Entity-Relationship 和关系模型中术语的来源。 规范化 解决了某些冗余,这些冗余可以通过在 AND 处拆分来从 meaning/predicate 中消除。 (因此将其关联的 table/ 关系 替换为其他人的 JOIN)。

需要 3 个 tables: 这里有谓词 "singer SINGER made album ALBUM"、"song SONG is on album ALBUM" 和 "singer SINGER sings song SONG"。我们不能直接用前两个来表示第三个。但是由于第三个谓词 第一个加上第二个 在您的特定应用程序 中隐含,因此您不需要它。即 "singer SINGER sings song SONG" 在您的应用程序中恰好在 "for some ALBUM, singer SINGER made album ALBUM and song SONG is on album ALBUM" 时。 (即谓词满足于 (SingerAlbum JOIN songAlbum) PROJECTed on SINGER & SONG 中的行。)但是如果说多个歌手可能在一张专辑中,而不是同时演唱所有歌曲,或者如果说有歌曲被演唱但不在一张专辑中,那么前两行并不意味着第三行,因此您既不能表达也不能从其他行中推断出第三行中的行。 (注意你添加 "at least one"/"only one" 如何使谓词和约束复杂化并导致冗余设计,即使你认为你 "simplified the modeling to focus the question on the main topic".

再优化:总是先做出最直接的设计。在您有更多的设计和查询经验以理解相关因素之前,您不应该担心存储和时间的权衡。然后您应该使用估计和测量来证明更改的合理性。