淹没在无海之中

Dev*_*Dan 8 null refactoring database-design normalization

我继承的应用程序跟踪对材料样本执行的实验室测试结果.数据存储在单个表(tblSampleData)中,主键为SampleID,235列表示潜在的测试结果.问题是每个样本只执行少量测试,因此每行包含200多个空值.实际上,还有第二个类似的表(tblSampleData2),其中包含另外215个主要为空的列和一个SampleID的主键.这两个表具有一对一的关系,大多数SampleID在两个表中都有一些数据.但是,对于每个SampleID,都有400个空列!

这个糟糕的数据库设计?如果是这样,哪个正常形式规则被打破?如何查询此表以确定哪些列通常与数据一起填充?我的目标是拥有45个表,10列,空值更少.我怎样才能做到这一点?如何避免破坏现有应用程序?

到目前为止,这些表有大约200,000个样本记录.用户要求我为更多测试添加更多列,但我宁愿构建一个新表.这是明智的吗?

DCN*_*YAM 9

我看过文章/论文表明在数据库中简单地使用NULL会破坏第一个正常形式.

根据我从数据库描述中收集的内容,更好的设计可能如下:

带有始终与样本关联的字段的Sample表.例如,

Sample
------ 
SampleID 
SampleDate 
SampleSource
Run Code Online (Sandbox Code Playgroud)

然后,测试类型表,每种类型的测试都有一个条目可以执行.

TestType
--------
TestTypeID
TestName
MaximumAllowedValue
Run Code Online (Sandbox Code Playgroud)

最后,有一个中间表,表示上述两个表之间的多对多关系,并保存测试的结果.

TestResult
----------
SampleID
TestTypeID
TestResult
Run Code Online (Sandbox Code Playgroud)

这将消除空值,因为TestResult表只包含对每个样本实际执行的测试的条目.我曾经设计过一个数据库,其目的与我相信你正在做的几乎相同,这就是我采用的方法.


Ken*_*itt 1

我不确定这个设计真的那么糟糕。实际上,NULL 值的存储成本应该相对较低。在 SQL Server 中,每行都有一个内部位字段(或多个字段)来指示哪些列值为 NULL。

如果应用程序的性能不需要提高,并且由于更改表架构而进行重构的成本效益并不积极,那么为什么要更改它呢?