SQL表设计。是否应该为接受空值的字段创建子表?

时间:2019-01-14 10:22:46

标签: sql database database-design

上下文:我有一个包含20列的表格。该表包含从文件导入的记录,以后必须对其进行处理。因此,存在名为ProcessDateTime的列,以将记录标记为已处理。

此表将达到数百万条记录。有些记录将永远不会被处理。

我有几个问题:

  • 让我们说95%的记录将被标记为已处理。我应该创建一个子表来存储此ProcessedDateTime吗?
  • 如果只处理其中的50%,该怎么办?它对数据库设计有什么影响吗?
  • 我们只谈论一栏。如果他们在相同情况下放置5或6列怎么办?
  • 在这里还要画一条线吗?

谢谢

编辑: 选择数据时,我希望未处理且不早于一个月的记录。因此,我将有一个日期字段来告诉我何时插入它们。

1 个答案:

答案 0 :(得分:2)

我不建议将记录分离到一个单独的表中,这只会使数据库的管理更加复杂。

在设计数据库时,一个非常重要的考虑因素是将运行查询,而不仅仅是理论上的考虑。我猜想您想快速访问ProcessDateTimeNULL的行。

在这种情况下,您要担心的是,您需要的行将被细分散在许多行中。反过来,这意味着您在内存中有很多数据页,但是大多数记录将不受欢迎,因为该值不是NULL

数据库还有另外两个选项可以解决此问题:聚集索引和分区(尽管并非所有数据库都支持它们)。将NULL值更新为非NULL值时,这两种方法都会产生额外的开销-基本上,记录需要“切换”分区/数据页位置。

也就是说,在某些情况下,拥有未处理的行表是有意义的,然后在处理后将它们“存档”。尽管功能相同,但问题的描述却不同。在此描述中,重点放在未处理的行上。经过处理后,它们将保存在归档中,而这些值可能不会更改。