![]() |
1
1
我不确定设计是否真的那么糟糕。空值的存储成本应该相对较低。在SQLServer中,每行都有一个内部位字段(或多个字段),用于指示哪些列值为空。 如果应用程序的性能不需要改进,并且由于更改表模式而进行重构的成本效益也不是正面的,那么为什么要更改它呢? |
![]() |
2
9
根据我从您对数据库的描述中收集到的信息,更好的设计可能如下所示: 包含始终与样本关联的字段的样本表。例如,
然后,一个测试类型表,其中可以执行的每种类型的测试都有一个条目。
最后,创建一个中间表,该表表示上述两个表之间的多对多关系,并保存测试结果。
这将消除空值,因为TestResult表只包含对每个样本实际执行的测试的条目。我曾经设计过一个数据库,目的和我相信你正在做的几乎一样,这就是我采取的方法。 |
![]() |
3
4
Entity Attribute Value model (EAV)。关于何时适合使用EAV的描述非常符合您的用例:
在您的特定情况下:
EAV有一些严重的缺点,并且产生了许多困难,所以它应该只在合适的时候应用。如果需要在一行中返回特定样本的所有测试结果,则不应使用它。 在不破坏现有应用程序的情况下,很难修改数据库以使用此结构。 |
![]() |
4
1
仅仅因为没有破坏任何正规形式的规则并不意味着它不是糟糕的数据库设计。通常情况下,最好采用较小行的设计,因为这样可以在一个页面中容纳更多行,从而减少数据库的工作量。在当前的设计中,数据库服务器必须占用大量空间来保存空值。 避免破坏现有的应用程序是困难的部分,如果其他应用程序只需要读访问权限,您可以编写一个看起来与旧表相同的视图。 |
![]() |
5
1
如果您确实更改了表结构,我建议使用一个名为tblSampleData的视图,该视图返回与表现在相同的数据。这样可以保持一些兼容性。 |
|
6
1
|
![]() |
7
0
假设你有40个测量通道的测试机X。如果您知道在每个测试中测试人员只使用几个通道,您可以将设计更改为: 测试:testId,testDate 您可以使用交叉表随时检索上一个布局。 |
![]() |
8
0
我将使用1个主表,其中每个示例有1行,它将包含每个示例应有的所有列:
然后,我将为每个不同的测试或类似测试的“类”添加一个表,并包括与这些测试相关的所有列(使用实际的测试名称,而不是XYZ):
|
![]() |
9
0
EAV是一个选项,但是查询会杀死你。 是否可以选择将数据迁移到像MongoDB这样的NoSQL数据库?我相信这将是解决你问题的最有效和最简单的方法。既然你提到你基本上是在做CRUD查询,NoSQL应该相当有效。 |
![]() |
10
0
结构 而不是简单地添加一些 多个“定义”测试的表。更糟糕的是,它需要对现有表进行结构更改,而不是添加新表。
我希望这能提供一些开始的想法。 |