最佳数据库结构 - 具有空字段或更多表的"更宽"表?

sil*_*npi 12 database optimization database-design database-optimization

我需要将其他数据放入数据库中,我可以选择修改现有表(table_existing)还是创建新表.

这就是table_existing现在的样子:

table_existing
-------------------------
| ID | SP | SV | Field1 |
| .. | WW |  1 | ...... |
| .. | WW |  1 | ...... |
-------------------------
Run Code Online (Sandbox Code Playgroud)

选项(A)

table_existing
----------------------------------------------------------------------
| ID | SP | SV | Field1 | Field2 | Field3 | Field4 | Field5 | Field6 |
| .. | XX |  1 | ...... | ...... | ...... | ...... | ...... | ...... |
| .. | YY |  2 | ...... | ...... | ...... | ...... | ...... | ...... |
----------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

选项(B)

table_existing would be converted into table_WW_1_data
---------------
| ID | Field1 |
| .. | ...... |
| .. | ...... |
---------------

table_XX_1_data
------------------------
| ID | Field1 | Field2 |
| .. | ...... | ...... |
| .. | ...... | ...... |
------------------------

table_YY_2_data
---------------------------------
| ID | Field1 | Field2 | Field3 |
| .. | ...... | ...... | ...... |
| .. | ...... | ...... | ...... |
---------------------------------
Run Code Online (Sandbox Code Playgroud)

上下文:SP,SV的组合确定将填充的字段的"数量".例如,(XX,1)有2个字段.(YY,2)有3个字段.

如果我使用选项(A),我会在"更宽"的表中有许多空/ NULL值.

如果我选择选项(B),我基本上创建更多的表格......一个用于SP,SV的"每个"组合 - 总共可能有4-5个.但每个都将填充正确数量的字段.table_existing也会被更改.

从速度的角度来看,更优化的数据库结构是什么?我认为从可维护性的角度来看,选项(B)可能会更好.


EDIT1

这两个选项都不是我应用程序中最关键/最常用的表.

在选项(B)中,在分割数据之后,根本不需要加入它们.如果我知道我需要XX_1的字段,我会去那张桌子.

我试图了解是否有一个包含许多未使用值的大型表与在更多表中分配相同数据的优缺点.大量的表是否导致数据库中的性能损失(我们已经有~80个表)?

Per*_*DBA 19

从速度的角度来看,更优化的数据库结构是什么?

什么是正确的,最佳实践等,称为规范化.如果你这样做,将没有可选列(不是字段),没有Null.可选列将位于单独的表中,行数较少.当然,您可以安排表格,使它们成为可选列的集合,而不是(一个PK +)每列一列.

将子表中的行组合成一个5NF行很容易,这样就可以查看(但不要通过视图更新,通过事务存储过程直接对每个子表执行此操作).

更多,更小的表是规范化关系数据库的本质.习惯它.由于缺乏规范化,重复和无效,更少,更大的表更慢.在SQL中加入很麻烦<但这就是我们所拥有的.连接本身没有成本,只有连接的表(行,行宽,连接列,数据类型,不匹配,索引[或不]).数据库针对规范化表进行了优化,而不是针对数据堆.和大量的表.

这恰好是最佳表现,毫不奇怪.有两个原因:

  1. 表格较窄,因此每页有更多行,每个物理I/O可获得更多行,同一缓存空间中有更多行.

  2. 由于你有No Nulls,那些列是固定的len,没有解压缩来提取列的内容.

对于具有许多可选(空)列的大型表,没有优点,只有缺点.从来没有一个专业人士违反标准.

无论您是考虑4或400个新表,答案都是不变的.

  • 如果您正在认真考虑许多表格,那么一个建议是:您正朝着第六范式的方向前进,却没有意识到这一点.所以要实现它,并正式这样做.400表将更好地控制.如果你有专业人士去做,他们会将其标准化,并最终回到不到100.

  • "对于具有许多可选(空)列的大型表,没有优点,只有缺点.从来没有专家违反标准." 鉴于所有现实世界的证据都相反,这对我来说太强烈了. (2认同)
  • 虽然我同意大多数论点,但对教科书来说听起来有点儿.如果你看一下[非规范化](https://en.wikipedia.org/wiki/Denormalization),你会发现现实是不同的. (2认同)