1 对多、多对多、多对 1 的数据库规范化

Database normalization for 1 to many, many to many, many to 1

提问人:PassingThru 提问时间:8/18/2023 最后编辑:philipxyPassingThru 更新时间:8/19/2023 访问量:54

问:

对于这两种情况,我都使用相同的颜色 [查找] 表,但存储数据的方式不同。下面是要存储的记录的规范:

  • ID 为 1 的汽车有 3 种颜色可供选择:蓝色、红色、白色。
  • ID 为 2 的汽车有 2 种颜色可供选择:蓝色、红色

颜色

同上 名字
1
2
3

方案 1

汽车

同上
1
2

车彩

同上 CarId 颜色 Id
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2

方案 2

汽车

同上 颜色 ID
1 1,2,3
2 1,2

哪个是存储数据的首选?

我在这两种情况下都使用了该结构。方案 1 似乎是最灵活的。需要关于前进的首选的建议。

sql-server 数据库规范化 第一范式

评论

1赞 Thom A 8/18/2023
1. 每一次。为什么你认为场景 2 是正常化的?它打破了 1NF。
0赞 Aaron Bertrand 8/18/2023
^同意。要改掉的坏习惯:在每张桌子上放一个 IDENTITY 列
0赞 philipxy 8/18/2023
你的 1(具体研究非重复)问题是什么?你在哪里以及如何第一次被困在什么设计方法?如何询问帮助中心Stack Overflow 用户需要付出多少研究努力?
0赞 philipxy 8/18/2023
在数据库列中存储分隔列表真的有那么糟糕吗?

答:

0赞 PassingThru 8/18/2023 #1

David Browne的评论

对于 1) 删除 CarColor 中的 ID 列,并将 (CarId,ColorId) 设置为主键。该 ID 是无用的,无论如何都需要 (CarId,ColorId) 的唯一索引。

引导我阅读这篇文章,并说服我使用这种方法。具体而言,应尽可能使用自然键,并且不要在一列中存储多个键(如方案 2)。