ORIGINAL(请参阅下面的更新问题)
我正在设计一个新的实验室数据库,可以测试各种样本类型的各种测试。
以下列表是我目前最佳的实体工作清单候选人。
对于每个实体,从该实体到下面的实体存在一对多的关系。换句话说,每个实体(REQ除外)至少包含 entity _id和 parent _id的列。
主要实体:
REQ:
请求(表格)
SAM:
样品(材料)
TST:
测试(要求的程序)
SUB:
**
子测试(标准测试的一部分)
TRI:
**
试用(单个实例:通常用于均值,范围和stddev)
MEA:
测量(测量数量)
**
并非所有测试都有子测试,并非所有测试都有试验。
子测试是一组由单个名称组合在一起的测试,以便于参考。例如,特定产品的批次验收测试(LAT)定义为以下测试:粘度,% - 氮,pH和密度。
试验是针对产品保证多次进行的单个实验。例如,可能会射击50发子弹,每次射击都是试验。每颗子弹的准确度可能需要在一定范围内,并且所有五十发子弹的平均精度可能需要在更紧的范围内。
问题:如果不需要进行子测试和/或试验,我应该如何建模?
选项1:如果不需要,请使用“空白”子测试(或试用版)。
选项2:将子测试和试验视为测试(并将test_id作为父级),以便测量始终将测试作为父级。
选项3:用于测量(试验,子测试或测试)和试验(子测试或测试)的可选父母。
选项x:任何其他值得考虑的选项。
仅供参考:如果需要回答这个问题,我将使用Oracle。
更新的问题 一般来说,我的模式是一个实体的层次结构,其中每个实体(顶部除外)必须有一个父级,(底部除外)必须至少有一个子级。处理在某些情况下不需要内部实体的情况的最佳方法是什么,或者使用特定选项的好处/缺点是什么?
选项1(虚拟):在这种情况下,使用“虚拟”条目表示实体不适用。
选项2(汇总):将可选实体汇总到下一个更高的父实体。
选项3(Pick-a-Parent):具有所需实体(A)的可选实体(B)下面的实体(C)必须具有一个父级,但父级可以是可选实体( B)或下一个更高的(A)。
选项x:任何其他值得考虑的选项。
答案 0 :(得分:1)
使用外部联接。 (右外连接和左外连接)。
他们是专门为此而制作的。
答案 1 :(得分:1)
<编辑>这是我的第一篇文章。根据评论,我将添加第二篇文章。
这是我对建筑第一次传球的看法。这些东西通常需要与主题专家进行大量的反复才能做到正确。
“测试”是指以下之一:
- 采取行动,衡量结果
- 采取多项措施(分测验),测量每一项的结果
- 不做任何测试(但你仍然可以进行测量 - ?)
我将其配置为“父”测试表和子“SubTest”表,其中Test可以有0个或更多相关的子测试,并且每个SubTest必须与一个且仅一个测试相关。 (如果测试只有一个SubTest,请在自己的表中输入,不要尝试跟踪Test表中的SubTests。)
只有存在SubTests才能进行试验。因此,试验是SubTest表的子项;子测试可以有零个或多个试验,试验必须与一个且只有一个子测试相关。
仅在有试验时才存在测量。因此,重复上述内容,将措施作为试验的孩子。
可以在没有试验(或测试)的情况下进行子测试吗?如果是这样,那么不要输入任何试验。
没有试验可以有措施吗?如果不是,您不需要任何试验(或子试验)。如果是(?),请再次输入一些正确标记的虚拟/ placholder子测试或试验。
同样,这是初步的,需要更多采访驱动需求的人。
答案 2 :(得分:1)
正如其他人所说,我们很难在不了解您的域名的情况下给出明确的答案。您试图将许多业务规则提炼为几个段落,但一些重要信息已丢失。具体而言,在不知道其属性的情况下,不可能确定两个实体是否真正不同。说完了所有这些,让我们一起去吧。
TEST
是一个程序。尽管包含“测试”一词,但LAT本身并不是TEST
,而是一组预先定义的此类程序。我会将此场景建模为具有可选父实体的实体TEST
,我更愿意将其称为TEST_GROUP
(因为它就是这样)但最好使用域名{{ 1}}。
SUB_TEST
似乎与TRIAL
不同,因此将其建模为单独的实体。因此,您可以选择TEST
:您可以拥有一个带有两个可选外键的实体,也可以拥有MEASUREMENT
和TEST_MEASUREMENT
。选择走哪条路取决于特征和使用情况。
以下是对实体关系的初步尝试。当用户说“哦,不,这根本不是我的意思”时,这将成为项目的重点。
TRIAL_MEASUREMENT
修改强>
解决更通用的问题。
选项1(虚拟)
从不使用虚拟记录。这就像使用魔术值而不是null。解决方案比它解决的问题更糟糕。
选项2(汇总)
当父级和子级具有相同的属性时,这可以起作用。但如果它们具有不同的列,或者它们是不同的依赖项,则它不是可行的解决方案。即使它们具有相同的数据结构但业务用途不同,它仍然可能是一个问题。
选项3(挑选父母)
这将是我的首选解决方案。障碍是需要检查约束以确保已填充一个(且仅一个)符合条件的外键。你还需要防止允许太多的父母/祖父母/曾祖父母参与其中。
答案 3 :(得分:1)
解决简化问题:
根据您所描述的层次结构,如果我发现层次结构中的某些级别是可选的,我会质疑层次结构是否真正映射到我的域。我会考虑以不同的方式绘制我的关系,或者重新定义我的模式中的实体。
我不认为在这样的短空间内可以对一般问题做出更详细的回答,因为找出域的最佳表示是a)很难,b)对特定域非常具体。< / p>
答案 4 :(得分:0)
我不完全确定我理解你的问题的细节,但听起来你应该有以下内容:
表测试 test_id,request,sample,test
表子测试 subtest_id,test_id(测试的外键)
表格试验 trial_id,trial_name,measurement,subtest_id
所以,Test是子测试的集合(可能只是一个子测试),而子测试是Trials的集合(可能只是一次试验)
答案 5 :(得分:0)
我不完全确定我了解你的域名,但你可以这样做吗?
Tests
有一个parent_test_id
列,可以是NULL
(设置后,这是一个子测试)。
Trials
有一个test_id
列。 (所有测试都至少进行了一次试验,因为你做了一件事,至少有一次测量,对吗?)
Measurements
有一个trial_id
列。
这似乎违反了你的前提,因为它规定所有测试都至少有一次试验,所以我可能会误解这些要求。你如何进行没有试验的测试?
无论如何,如果有必要,您可以在trial_id
上放置test_id
和Measurements
,可能有一个约束,其中一个必须为NULL(另一个必须是设定)。
答案 6 :(得分:0)
根据我第一篇文章的反馈,我会再次尝试这一次。要理解的关键是设计和架构可以高度迭代,我怀疑你会得到理想的模型而不需要很多来回 - 这在Stack Overflow上并没有很好地发挥作用。很可能你会发布想法(APC有一些好的),与你合作的人一起反弹,并提出一些有用的东西。
我设计数据库的目标是尝试生成完全规范化的模型。一旦你有了它,如果它看起来不合理或不实用,你可以对效率,权宜之计或其他任何东西进行非规范化 - 但关键是你在找到理想的模型之后对进行非规范化。如果你在之前停止标准化,你就会完全规范化,你没有非规范化,你只是一个草率的模型。
这是我见到的实体:
您将其标记为顶级测试,为了清楚起见,我将打电话给考试。您可以定义考试及其所有内容(如下所示),人们会联系您的实验室,对他们的问题进行考试。
对于为客户执行的任何特定考试,您都会运行一系列测试。任何给定的测试都可以由(需要?)任意数量的考试使用。
通常,您会获得一组测试,这些测试一起完成多个考试。如果存在适用于特定测试集的属性,则可能需要将每个集标识为其自己的实体。称这些 TestGroups 。但是,如果仅使用这些测试将一组特定的测试与一个或多个考试相关联,那么您可能无法将它们定义为自己的实体。 (这些是你的子测试。)
因此,考试“拥有”或“包含”一项或多项考试。或者,考试与一个或多个TestGroup相关。但是,尝试将检查与零个或多个TestGroups 和零个或多个单独的测试相关联将产生一个过于复杂的模型(更不用说物理实现),我真的想避免这种情况。也许TestGroup可以包含一个Test,所以Exams只引用TestGroups?也许一个考试只能与一个TestGroup相关 - 在这种情况下,这将是与考试相关的“多对多”表格。这取决于与主题专家进一步讨论要求。
所以你有考试 - 考试定义,真的 - 以某种方式或其他与多个测试相关。接下来,您有一个考试的“付费实例”(客户X进来并付钱给您测试他的小部件)。将此称为 CustomerExam ;它具有所有联系和计费信息,标识要运行的考试,因此与要为客户执行的测试相关。 (那里可能还有一个客户实体......?)
对于属于CustomerExam的测试,试用已经完成。它们与考试或考试无关,它们是正在进行的试验的实例。 (似乎可以安全地假设试验的“含义/定义”实际上是测试的一部分 - 例如,如果测试=枪是准确的,那么该测试的试验所需的工作=消防枪50次并且测量)。因此,对于给定CustomerExam的测试执行试验。它们是一次还是不止一次? (试射枪是50次,还是每次射击算作试验?如果他们进行两轮50次射击怎么办?)无论如何,试验事件的属性都存储在这里 - 当它发生时,谁做了它,特殊注释/情况,无论如何。
措施是由(或针对?)试验产生的。每项措施的含义/定义实际上是试验定义的一部分(试验定义的一部分);试验事件为已定义/预期的措施生成特定值。假设试验将生成零(?)或更多的度量,因此度量是它们自己的实体。
回顾一下,似乎存在某种形式的隐式双重结构:一组表来定义可用的考试,考试,试验和测量(可以检查什么,如何测试,我们应该测量什么)和一组伴随的表来跟踪每个人的具体实例(谁想要它,谁做了工作,他们什么时候做,结果是什么)
我必须过度解决这个问题。这里的关键是,与所有设计会议一样,在提出想法和提出问题时,他们是否会产生自己的想法,问题或答案?