【发布时间】:2017-09-07 06:27:06
【问题描述】:
在阅读了我的书并浏览了一些 youtube 教程后,我对规范化的理解是,重要的事情之一是没有重复值。更具体地说,主键 (ID) 不应重复。
因此,如果我正在使用音乐/音乐会数据库中的一些表,那么以下情况将很糟糕:
**CREATE TABLE Artists**
ArtistID INT *PRIMARY KEY*
ArtistName VARCHAR(30)
Albums
- ^在 Artists 表中有专辑会很糟糕,因为有一个 许多专辑的艺术家。因此必须显示 ArtistID 多行[艺术家的每张专辑一次]
问题:这样的表是否应该有一个与另一个表相关联的外键?我会想到的相关表显然是相册。
相册会有这样的栏目:
CREATE Table Albums (
Album_ID INT NOT NULL AUTO_INCREMENT,
Album_Name VARCHAR(30),
Artist VARCHAR(30),
Release_Date DATETIME,
Genre or GenreID,
Primary Key (Album_ID) );
问题:但专辑有歌曲。但是,我不能将专辑 ID 作为主键,然后让所有歌曲都具有专辑 ID 的重复主键,我可以吗?因此,我应该将“歌曲”属性保留在专辑表之外吗?
【问题讨论】:
-
Q1(A1):但一张专辑不能有多个艺术家吗?所以你不需要一个 AlbumArtists 表来解决艺术家和专辑之间的多对多问题吗? Q2(A2) 是的,歌曲属于它自己的表,至少符合第 3 范式。
-
我想我对何时使用多对多和一对多更好,反之亦然感到困惑? AlbumArtists 中有什么内容?
-
您应该很少(从不?)允许多对多持续存在。它应该始终是一对一或一对多。或多对一。 AlbumArtists 将拥有来自专辑和艺术家的 ID。也许发布日期(有些专辑被重构和重新发布,对吗?所以发布日期可能会与出版商(有时是不同的出版商)一起去那里)等等。为什么你不想要多对多是因为没有连接/关联表你不能支持多对多,因为你需要在每个基表中有多个 ID。
-
像“80 年代最好的专辑”这样的专辑就是一个很好的例子,一张专辑可以包含多个艺术家,因为每首歌都可能来自不同的群体。这是一个很好的例子,说明为什么您需要一个 ArtistAlbum 甚至可能是“AlbumArtistSong”表。
-
您似乎没有掌握发生了什么。你需要记住和应用定义。 PK 只是你决定称之为的一些 CK。 CK 是一组是唯一的列,并且不包含更小的这样的集合。 PK 列不可能可以重复值,那么“不应该”是什么意思?此外,没有“用于”实体的表,只有用于应用程序/业务关系的表。 (尽管 ER 建模以一种受限的方式使用表,将“实体”表与“实体类型”相关联。)
标签: mysql many-to-many primary-key one-to-many database-normalization