具有多个类别类型数据库架构的产品

product with multiple category type database schema

我想存储歌曲文件的分类信息:
1. 流派例如:流行、摇滚、古典等
2. 钢琴小提琴等乐器
3. 艺术家
每首歌都有很多乐器。每首歌都有很多艺术家。
所以所有的关系都是多对多的。我该如何实施?在歌曲实体和这三个类别类型实体之间建立多对多关系是个好主意吗?或者我应该只有一个继承这些子类别的类别实体吗?
提前致谢

乐器和艺术家都是 "has-a" 关系的例子。流派是 "is-a" 关系的一个例子。 Has-a 和 Is-a 关系在关系数据库设计中的建模方式截然不同。一首歌是一首流行歌曲,一首歌是一首摇滚歌曲。 (我推测一首歌既可以是流行的又可以是摇滚的,但是你的描述中并不清楚)。

Has-a 关系更为常见,并且通常在任何好的教程中都有介绍。 Is-a 关系在这些相同的教程中通常没有得到足够的覆盖。如果您想获得一些关于 is-a 关系的 ER 建模的文章,请查找 "generalization/specialization"。这将解释如何描述其中一种关系,而不是如何设计 tables 以适应。

如果您熟悉对象建模,那么您最容易理解的概念就是 class/subclass 模式,又名 type/subtype。这很简单,但它依赖于对继承的内置支持。这种支持通常存在于任何对象系统中,并为您完成大部分艰苦的工作。如果您正在设计一个关系数据库,您就会面对这样一个事实,即关系模型不直接支持继承。这意味着您必须设计模仿继承优势的 table,除非您愿意使用 SQL 方言中可用的 SQL 扩展。

通过这两个标签的名称可以知道两个比较标准的设计:

您可以通过阅读每个标签的“信息”选项卡获得简要说明。通过查看 Martin Fowler 对这两种模式的处理,您可以获得更好的描述。

单个 table 解决方案将帮助您为所有歌曲文件创建单个 table,其中包含属于任何或所有类别的列。

classtable解决方案将帮助您为歌曲文件设计一个table,为每个流派设计一个table。如果您使用共享主键技术,从而使流派中的每个条目 table 到歌曲文件 table 中相应条目的 ID "inherit",这将很有帮助。当你要插入一个新的歌曲文件时,你必须通过额外的编程来实现这种继承。

哪个更好?这取决于你的情况。你来决定。