在数据库设计中将 N:N 关系表示为函数依赖

Bot*_*ázs 6 database-design

作为一名软件开发人员,我在设计或多或少规范化的数据库模式方面已经有一些经验,但我之前没有接受过任何正式的培训。这个学期,我参加了大学关于数据库的课程。我们正在学习设计基于关系代数的模式的正式方法。首先,我们收集要存储的属性:

书店<TITLE、AUTHOR、CATEGORY、YEAR、PUBLISHER、PUBLISHER_ADDRESS>

然后我们找到属性之间的函数依赖:

f:{ TITLE, AUTHOR } -> { CATEGORY, YEAR, PUBLISHER, PUBLISHER_ADDRESS }
f出版商:{ PUBLISHER } -> { PUBLISHER_ADDRESS }

之后我们可以规范化这个模式。(为简单起见,我假设一本书仅由书名和作者定义,不会存储两个版本或同一版本的两份副本。)

现在当一本书可以有多个类别时会发生什么?我如何用依赖关系表示这种关系?类别不能再是次要属性,但如果它是主要属性,我该如何进行?

这定义了什么?

{ 标题、作者、类别} -> ???

我们被告知空集不能位于依赖项的右侧。

Nic*_*mas 1

要通过功能依赖关系将一本书与多个类别相关联,您需要引入一个人工属性来跟踪类别关联的数量。

因此,您的功能依赖性将是:

f_book:          { TITLE, AUTHOR } -> { YEAR, PUBLISHER, CATEGORY_COUNT }
f_book_category: { TITLE, AUTHOR, CATEGORY_INDEX } -> { CATEGORY }
f_publisher:     { PUBLISHER } -> { PUBLISHER_ADDRESS }
Run Code Online (Sandbox Code Playgroud)

这种暴行是由于以下事实所必需的:作为函数,它们对于给定的输入只能返回一个输出。

除非您将适用于给定书籍的类别列表视为单个值,否则无法将一本书与多个类别直接关联,正如 Catcall 建议的那样。