Database design ER模型:何时添加关系以及何时不添加关系

Database design ER模型:何时添加关系以及何时不添加关系,database-design,entity-relationship,Database Design,Entity Relationship,考虑一下ER设计的这个例子。我有三个实体: 歌手 相册 歌 每个歌手至少有一张专辑(根据定义),每个专辑至少有一首歌曲。每首歌只属于一张专辑。所以我也有两种关系: 专辑:歌手(一张或多张:1张) 歌曲:专辑(一张或多张:一张) 如果我想知道谁唱这首歌,我可以加入以唱片实体为中心的表格 现在我的问题是:我是否应该加上歌手和歌曲之间的直接关系?我不明白这是否仅仅取决于用例,或者是否有严格的规则/最佳实践。如果我添加它,我会使用更多的磁盘空间,但我需要更少的内存来查询歌曲作者(我不需要加入) 哪个是解

考虑一下ER设计的这个例子。我有三个实体:

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

  • 专辑:歌手(一张或多张:1张)
  • 歌曲:专辑(一张或多张:一张)
  • 如果我想知道谁唱这首歌,我可以加入以唱片实体为中心的表格

    现在我的问题是:我是否应该加上歌手和歌曲之间的直接关系?我不明白这是否仅仅取决于用例,或者是否有严格的规则/最佳实践。如果我添加它,我会使用更多的磁盘空间,但我需要更少的内存来查询歌曲作者(我不需要加入)


    哪个是解决方案?

    编辑:我刚刚意识到,你的每张专辑只有一个歌手。在本例中,您有三种关系:

    • 歌手专辑
    • 歌曲集
    • 歌手歌曲
    您的理解是正确的-您可以选择使用这三种方法,以提高磁盘使用率,但加快查询速度。或者,您只能选择两种,以减少磁盘使用量和降低查询速度


    它总是以个案为基础的——如果您知道可以用两个表表示关系,而不会丢失数据,那么速度和大小由您选择。然而,一个重要的考虑因素是未来打样。比如说,将来你可能希望每张专辑都有一个以上的歌手。那就不再是暗示哪个歌手唱哪首歌了。综上所述,它是一个数据库,所以你通常希望它又大又快。

    编辑:我刚刚意识到,你每张专辑只有一位歌手。在本例中,您有三种关系:

    • 歌手专辑
    • 歌曲集
    • 歌手歌曲
    您的理解是正确的-您可以选择使用这三种方法,以提高磁盘使用率,但加快查询速度。或者,您只能选择两种,以减少磁盘使用量和降低查询速度

    它总是以个案为基础的——如果您知道可以用两个表表示关系,而不会丢失数据,那么速度和大小由您选择。然而,一个重要的考虑因素是未来打样。比如说,将来你可能希望每张专辑都有一个以上的歌手。那就不再是暗示哪个歌手唱哪首歌了。综上所述,它是一个数据库,所以你通常希望它又大又快。

    (我假设专辑:singer和歌曲:album实际上都是1-or-more:justice-1,因为你的“一对多”与你的其他描述相矛盾。)

    Re 2个表是否正确:您不应该同时使用这三个表。SingerSong始终等于SINGER&SONG上的(SingerAlbum加入歌曲专辑)。当两个表的设计只涉及一个表时,使用所有3个表是冗余的,需要更新多个表,并且需要多表约束来强制SingerSong和其他表之间的一致性

    重新设计表格:每一张表格都有一个意义/谓词,每一行和每一行(适合它的)都有一个陈述/命题。我们选择足够的含义/谓词来描述可能出现的所有情况。(请参阅re-bases and re-queries和我的其他使用“谓词”的答案)“冗余”是指两行同时进行重叠的语句/命题。然后我们必须更改多行,而在另一个设计中,我们可以只更改一行。(或多或少)我们只需要知道我们所选择的含义/谓词是什么。可悲的是,大多数信息建模方法和产品不涉及关系/关系的含义/谓词,即使它们是实体关系和关系模型中术语的来源和建模的基础。规范化处理某些冗余,这些冗余可以通过在AND处拆分语义/谓词来消除。(因此,将其关联的表/关系替换为其他表/关系的联接)

    我们需要3个表:这里有谓词“singer-singer制作的专辑”、“song song在专辑中”和“singer-singer-sings song”。我们不能用前两个直接表达第三个。但是,由于第三个谓词在特定应用程序中由第一个谓词加第二个谓词暗示,因此不需要它。Ie“singer singer sings song”在您的应用程序中的确切时间是“对于某些专辑,singer singer制作了专辑,歌曲在专辑中”。(即(SingerAlbum JOIN songAlbum)中投射到SINGER&SONG上的行满足的谓词。)但是,如果说一张专辑中有多个歌手,而不是两人都唱所有歌曲,或者说一张专辑中有歌曲,但没有,那么前两个并不意味着第三个,因此你既不能表达也不能从其他行中推断第三个行中有哪些行。(请注意,添加“至少一个”/“仅一个”会使谓词和约束变得复杂,并导致冗余设计,尽管您认为“简化了建模以将问题集中在主要主题上”

    重新优化:始终首先生成最简单的设计。在拥有更多的设计和查询经验以了解相关因素之前,您不应该担心存储和时间的权衡。然后,您应该使用估计和测量来证明更改的合理性。

    (我假设专辑:歌手和歌曲:专辑实际上都是1-或更多:确切地说是-1,因为你的“一对多”与你的其他描述相矛盾。)

    Re 2个表是否正确:您不应该全部使用这三个表。SingerSong始终等于SINGER&SONG上投影的(SingerAlbum JOIN SongAlbum)。当两个表的设计涉及到