【发布时间】:2021-09-04 06:31:58
【问题描述】:
我有以下album 表:
| album_id(PK) | album_name | artist_name | year | songs |
|---|
我的候选键是{id} 和{album_name, artist_name}。
现在,我要将表格规范化到3NF,我想知道artist_name列数据冗余的原因。
1NF
目标:列应该是原子的。
结果:
album:
| album_id(PK) | album_name | artist_name | year |
|---|
song:
| song_id(PK) | album_id(FK) | song_name |
|---|
2NF
目标:非主属性(不存在于任何候选键中的列)对候选键没有部分功能依赖。
解决方案:我找不到任何部分功能依赖。 (也许我不知道表格中有它们。)
3NF
目标:非主属性对候选键没有传递函数依赖关系。
解决方案:我找不到任何传递依赖。
问题
虽然上面的表格看起来很规范,但我注意到了以下问题(可能更多):artist_name 列中的数据是多余的。拥有多张专辑的艺术家的姓名会被多次存储,这是我们反对的。
我在这里缺少什么?谢谢。
【问题讨论】:
-
请注意"1NF" has many meanings.(所有这些都涉及将某些表与参数化结构的某些表替换为每个参数的列。)“关系”也没有。即使 1NF 删除了所谓的“非原子”属性,该词也没有标准含义,也没有标准的方法。如果歌曲的类型列表为 x,那么通常我们会期望 1NF 设计具有类型为 x 的属性歌曲。除非您提供相关的类型信息、“原子”的定义以及如何标准化为 1NF,否则我们无法知道您所做的是否正确。
-
一个值多次出现本身并没有错,“冗余”没有特殊含义,规范化只会消除某些冗余。您的“问题”有很多重复的问题。请在考虑发布之前阅读手册和谷歌任何错误消息和许多清晰、简洁和准确的问题/问题/目标的措辞,带有和不带有您的特定名称/字符串/数字、“site:stackoverflow.com”和标签;阅读许多答案。反映你的研究。请参阅How to Ask、Help center 和投票箭头鼠标悬停文本。如果您发布问题,请使用一个措辞作为标题。
-
您没有明确说明您的“问题”。您没有以“我们反对”的方式解释“冗余数据”或“多次存储”是什么意思,或者它们与 DB 规范化或 3NF 有什么关系,或者示例艺术家情况如何是“问题”,什么它是一个例子。 (您真的是指“多次”,您认为在关系或列中任何值都不应出现多次?即每一列都必须是超键/唯一的?否则,您到底是什么意思?如果是,为什么? 请准确地说出来。)
-
感谢@philipxy 的cmets。我一定会在以后的帖子中纠正我在提出这个问题时所犯的错误。
标签: relational-database database-normalization