您将如何在关系数据库中对其进行建模?

How would you model this in a relational database?

我有三个 table:书籍、传奇和宇宙。 Books 将 idSaga 作为外键。 Sagas 将 idUniverse 作为外键。

都是一对多的关系。

一本书可以是传奇故事的一部分,也可以是更大宇宙的传奇故事的一部分;例如:指环王和指环王是LOTR传奇的第一部分,LOTR在Legendarium宇宙中。

我应该如何称呼像《霍比特人》这样的书?它不是任何传奇的一部分,而是 Legendarium 宇宙的一部分。

我不想向 table Books 添加新字段(对于外键),这看起来像破坏规范化。 添加新的 table 以及书籍和宇宙之间的关系看起来有点过分。

如果 a 书“不是 a Saga 的一部分”,那么这会打破某种形式的逻辑——否则 Book 和Saga 需要暗示 Universe,但一本书可能暗示与其所属的 Saga 不同的宇宙。

如果每本书都是 a Saga 的一部分,即使只有单本书的 Saga ( 《霍比特人》是《霍比特人传奇》中唯一的一本书……目前 ;-))。

在基本形式中,如当前所述,这就是以下内容,防止出现这种矛盾的可能性,并允许一致地编写查询1,无论传奇中有多少本书。

Books M:1 Saga
Saga M:1 Universe

使用此模型的另一个原因,每本书都在 a Saga 中,它是否也适用于尚未建立的第一本 Saga 书籍(并且也许后续的书甚至都没有计划)。

当然,这可能不够灵活(阅读:太简单)与交叉,例如一些漫画书,这取决于所需的细化分类..也许不是传奇中的所有书籍都共享同一个宇宙。如果可能出现这样的怪事,那么一本书需要与 Universe 建立非 Saga 关系。

1 虽然可以使用视图相对简单地处理查询复杂性,但避免矛盾会增加模型的复杂性。一种方法是要求一本书成为传奇 宇宙的一部分;两者都不是。

I don't want to add a new field to the table Books (for the foreign key), it looks like breaking normalization.

这正是我会做的。我不确定你所说的“它看起来像打破规范化”是什么意思,但对我来说这似乎是理想的,因为 Book -> Universe 关系可能很有用。

例如,假设您有一个新功能,您想要计算给定宇宙中的所有书籍。如果您在 books table 中没有外键,则必须查询 sagas table 以获取与传奇无关的信息。

通过排除这个外键,你限制了你将来使用这个关系的选择。

总而言之,我会去:

Books M:1 Saga
Books M:1 Universe
Saga M:1 Universe

我也同意另一个答案,一本书可能存在于多个宇宙中,但是否允许由您决定:)