可选数据库实体(第2部分)

时间:2009-09-09 15:36:53

标签: database oracle database-design

请参阅下面的“几乎决定”


注意:这是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)。

问题
我应该如何为实体TestTrialMeasurement建模,因为Trial实体是可选的?

选项1:如果不需要,请使用“空白”试用实体作为占位符 好:父实体总是一样的。
错误:Trial条目即使不需要也存在。

选项2:Trial作为子测试滚动到Test表中。然后,度量将始终以test作为父级 好:用于测量的单亲类型(Test
错误:Test的多个父类型:SampleTest

选项3 :衡量指标仍有一个父级,但父级可以是testtrial。 好:Test的单亲类型(必要时为Event
错误:Measurement的多个父类型:TestTrial

选项4:作为子实体进行审核。 Measurement需要test_id和可选trial_num。试用的PK为(test_idtrial_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.

请提供任何关于它为什么是好或坏的选择的想法。

3 个答案:

答案 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表中还有哪些不可用的内容?


更新:鉴于其他详细信息,我建议您引入一个新实体,我将其称为TestRunTestRun仅在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>

换句话说,测试/试验二分法是红鲱鱼,measurementtestsample之间的交叉表。

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)

显然可能需要进一步的标准化。例如,您可能希望/需要将样本拆分为两个表samplesample_instance。如果不知道所涉及的所有属性,很难说清楚。