请参阅下面的“几乎决定”
注意:这是Optional Database Entities的继续和简化。
我正在设计一个新的实验室数据库,可以测试各种样本类型的各种测试。
主要实体:
每个必须有正好一个父级(REQ
除外)和至少一个子级(MEA
除外)。
Request REQ - the form Sample SAM - the materials on the form to be tested Test TST - the procedures to be performed on the sample (Trial ** TRI - instance of duplicate methods for statistics) Measurement MEA - a single measured number ** A Trial is optional. (see below)
可选试用说明
许多测试是一个简单的过程,只需进行一些测量。例如,“向样品中加入10 mL 15%的KNO 3,然后获得密度和pH值。”
然而,一些测试要求对样本的不同部分执行相同的过程。让我们以弹道测试为例。请求者可能要求这20个子弹的平均出口速度和准确度。 sample
是20个子弹的集合。 test
是“收集出口速度和准确度”。 trials
是被解雇的20个人。 measurements
是每次拍摄的出口速度和准确度(trial
)。
问题
我应该如何为实体Test
,Trial
和Measurement
建模,因为Trial
实体是可选的?
选项1:如果不需要,请使用“空白”试用实体作为占位符
好:父实体总是一样的。
错误:Trial
条目即使不需要也存在。
选项2:将Trial
作为子测试滚动到Test
表中。然后,度量将始终以test
作为父级
好:用于测量的单亲类型(Test
)
错误:Test
的多个父类型:Sample
或Test
选项3 :衡量指标仍有一个父级,但父级可以是test
或trial
。
好:Test
的单亲类型(必要时为Event
)
错误:Measurement
的多个父类型:Test
或Trial
选项4:作为子实体进行审核。 Measurement
需要test_id
和可选trial_num
。试用的PK为(test_id
,trial_num
)
好:没有多父类型。
不好:不确定
选项X:尚未提及的任何其他选项。
几乎决定:我现在认为选项4(作为子实体的试验)是最好的。以下是选项4的基本规则。
- measurement
始终属于test
。
- 仅在需要时才存在trial
。
- 当一组中存在多个试验时,设置Trial_num
。
- 否则trial_num
为空,表示不需要trial
。
Simple ER Diagram
-----------------
REQ <- SAM <- TST <- MEA
^ |
| |
|-(TRI)<-|
Table Keys
----------
Table | PK | FK
------+-----------------+----------------
REQ | REQ_id |
SAM | SAM_id | REQ.PK
TST | TST_id | SAM.PK
(TRI | TST_id, TRI_num | TST.PK )
MEA | MEA_id | TST.PK, TRI.PK*
* TRI.PK is null if trial entity is not needed.
请提供任何关于它为什么是好或坏的选择的想法。
答案 0 :(得分:1)
从我的解释中可以看出,可以说:
测试可能有一个或多个试验 与之相关联,并且只能进行试验 与一个测试相关联。
在这种情况下,试验是测试的子实体。如果是这样,那么您可能有两个表:
测试
试验
Trial表的外键字段将返回Test表(表示关系)。这样,每个试验只与一个试验相关联,每个试验可以有多个相关的试验。
答案 1 :(得分:1)
目前尚不清楚为什么有必要将Trial
表示为一个独特的实体。为什么以下架构不合适?
Sample Test Measurement
------ ---- -----------
SampleId (PK) TestId (PK) MeasurementId (PK)
Description SampleId (FK) TestId (FK)
TestStartDate Description
TestEndDate MeasuredValue
从你到目前为止所说的话,听起来你只能推断一个Test
多个Measurement
计为Trial
。也就是说,如果您的用户界面需要显示某个特定测试有试用版,那么可以执行以下操作:
if (test.Measurements.Count > 1) {
_View.Title = test.TestName + " (Trial)";
}
如果不是这样,那么您需要哪些属性缺少此架构?还需要在Trial
表中还有哪些不可用的内容?
更新:鉴于其他详细信息,我建议您引入一个新实体,我将其称为TestRun
。 TestRun
仅在Measurements
内对一个或多个Test
进行分组。 Trials
现已与TestRuns
相关联。
结果架构如下所示:
Sample Test TestRun Measurement
------ ---- ------- -----------
SampleId (PK) TestId (PK) TestRunId (PK) MeasurementId (PK)
Description SampleId (FK) TestId (FK) TestRunId (FK)
TestStartDate Description
TestEndDate MeasuredValue
Trial
-----
TrialId (PK)
TestRunId (FK)
Description
这与原始问题中的选项1 非常接近。如果维持空白(或虚拟)Trial
的成本很低 - 例如,如果Trials
具有很少或没有属性 - 这可能是更好的解决方案。
答案 2 :(得分:0)
这是一只风筝,由假设和解释承担高空。
request
附带sample
以及对样本执行的程序规范。如果sample
是单数(一瓶液体),则这是测试并收集一组测量值。如果sample
是多个(一个项目符号,一个时间序列),则这是试用,并且会收集一组重复的度量,每个sample
实例一个。< / p>
换句话说,测试/试验二分法是红鲱鱼,measurement
是test
和sample
之间的交叉表。
REQUEST
-------
RequestId (PK)
Specification
SAMPLE
------
RequestId (FK)
SampleId (PK)
TEST
----
RequestId (FK)
TestId (PK)
TestStartDate
TestEndDate
MEASUREMENT
-----------
TestId (FK)
SampleId (FK)
MeasurementDescription
MeasuredValue
Measurement(TestId,SampleId)
是复合唯一键。根据您对复合材料的感觉,您可能还希望定义代理MeasurementId (PK)
。
显然可能需要进一步的标准化。例如,您可能希望/需要将样本拆分为两个表sample
和sample_instance
。如果不知道所涉及的所有属性,很难说清楚。