Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有多类别类型数据库架构的产品_Sql_Database_Entity Framework_Schema_Erd_Single Table Inheritance_Class Table Inheritance - Fatal编程技术网

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

Sql 具有多类别类型数据库架构的产品,sql,database,entity-framework,schema,erd,single-table-inheritance,class-table-inheritance,Sql,Database,Entity Framework,Schema,Erd,Single Table Inheritance,Class Table Inheritance,我想存储歌曲文件的分类信息: 1.流派如:流行音乐、摇滚乐、古典音乐等 2.钢琴、小提琴等乐器 3.艺术家 每首歌都有许多乐器。每首歌都有许多艺术家 所以所有的关系都是多对多的。我如何实现这一点?在歌曲实体和这三个类别类型实体之间建立多对多关系是一个好主意吗?或者我应该只有一个继承这些子类别的类别实体吗 提前感谢乐器和艺术家都是“has-a”关系的例子。这种类型是“是一种”关系的一个例子。在关系数据库设计中,Has-a和Is-a关系的建模方式截然不同。一首歌是流行歌曲,或者一首歌是摇滚歌曲。(我

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

提前感谢

乐器和艺术家都是“has-a”关系的例子。这种类型是“是一种”关系的一个例子。在关系数据库设计中,Has-a和Is-a关系的建模方式截然不同。一首歌是流行歌曲,或者一首歌是摇滚歌曲。(我认为一首歌既可以是流行歌曲也可以是摇滚歌曲,但这在你的描述中并不清楚)

Has-a关系更常见,并且通常在任何好的教程中都有介绍。在这些教程中,Is-a关系通常没有得到足够的介绍。如果您想获得一些关于is-a关系的ER建模的文章,请查阅“泛化/专门化”。这将解释如何描述其中一种关系,而不是如何设计适合的表

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

根据这两个标签的名称,可以知道两种相对标准的设计:

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

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

类表解决方案将帮助您为歌曲文件设计一个表,并为每个流派设计一个表。如果您使用共享主键技术,从而使流派表中的每个条目从歌曲文件表中的相应条目“继承”其ID,这将非常有用。在插入新歌曲文件时,必须通过额外编程实现此继承


哪一个更好?这取决于你的情况。您自己决定。

最简单的方法是为关系本身使用单独的表。谢谢您的完整回答。^它帮助了很多