在规范化的数据库结构中,冗余数据是否是可接受的权衡?

Is redundant data an acceptable trade-off in a normalized database structure?

提问人:Bjarke Kingo 提问时间:6/12/2023 最后编辑:Bjarke Kingo 更新时间:6/13/2023 访问量:47

问:

在SQL中,我正在考虑以下问题。

我有一个A_ids列表和一个B_ids列表。

  • 唯一A_ids数 ~ 1.000s
  • 唯一B_ids数 ~ 1.000.000s

这个想法是,我为每个A_id都有一个B_ids列表,这个列表中可能有很多B_ids(多对多)。

我可以简单地将它们存储为以下格式

| a_id | b_ids |
| 1 | '1,2,3,4,5' |
| 2 | '1,2,4,5' |
| 3 | '1' |
| 4 | '1,2' |
| 5 | '3,4' |
| 6 | '2,3' |
...

然而,我读到了规范化,即简单地做:

| a_id | b_id |
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
| 2 | 1 |
...

是更好的做法,但我担心拥有大量行(即 1.000.000.000+)的影响

我理解两者的缺点,但更好的权衡是什么?

SQL MySQL 对多 数据库规范化

评论

0赞 Barmar 6/13/2023
是的,这通常被认为是可以接受的权衡。第一种格式的问题非常严重。关系数据库旨在支持大量行。
1赞 Bill Karwin 6/13/2023
您可能想阅读我的存储逗号分隔列表的缺点列表: stackoverflow.com/a/3653574/20860
1赞 philipxy 8/12/2023
这回答了你的问题吗?在数据库列中存储分隔列表真的有那么糟糕吗?

答:

1赞 NickW 6/13/2023 #1

正常化是要遵循的路线

  1. 对于现代 DBMS,这并不是一个特别大的行数
  2. 由于要适当地为表编制索引,因此只能访问任何查询实际使用的表中的行,而不是执行全表扫描(除非查询需要全表扫描)