问题描述
我正在为实验室测试创建一个数据库。
对于常规测试,每个 [试用] 引用一个 [SpecRev],它定义了 [TrialSetup] (设备参数) 和 [TrialResultLimits] (是否符合规范)。规格有时可能会被覆盖。
对于特殊测试 (试验5%),用户输入所有 [TrialSetup] 和 [TrialResultLimits] 字段。
QUESTION:我应该如何存储用于每个 [试用] 的 [TrialSetup] 和 [TrialResultLimits]?
OPTION 1: Store a copy
每个 [试用] 都指向 [SpecRev],但也存储所使用的 [SpecRev] 字段的副本 (或 “快照”)。对于覆盖,[试用] 将被标记,用户将修改复制的字段。对于特殊测试,用户在每个字段中输入。
OPTION 2: Reference Spec Revision
[审判] 指向 [特殊]。绝不能修改 [SpecRev],而是创建新的修订版。对于覆盖和特殊测试,将创建一个新的 [SpecRev] 并将其标记为隐藏 (不适用于将来的试用)。
从技术上讲,这些一次性的SpecRev行实际上并不是现实世界中批准的规范修订。
OPTION 3: Suggestions?
Thoughts:
1.复制数据 “感觉” 像个坏主意,但快照 “感觉” 像个好主意。不确定为什么。
2.每个 [试验] 引用 [SpecRev] 都感觉更健壮。然而,如果一个 [SpecRev] 曾经被无意中修改过,那么每个引用它的 [试验] 现在都是不正确的。
对于常规测试,每个 [试用] 引用一个 [SpecRev],它定义了 [TrialSetup] (设备参数) 和 [TrialResultLimits] (是否符合规范)。规格有时可能会被覆盖。
对于特殊测试 (试验5%),用户输入所有 [TrialSetup] 和 [TrialResultLimits] 字段。
QUESTION:我应该如何存储用于每个 [试用] 的 [TrialSetup] 和 [TrialResultLimits]?
OPTION 1: Store a copy
每个 [试用] 都指向 [SpecRev],但也存储所使用的 [SpecRev] 字段的副本 (或 “快照”)。对于覆盖,[试用] 将被标记,用户将修改复制的字段。对于特殊测试,用户在每个字段中输入。
SpecSetup (table): specRev_id, {TrialSetup & TrialResultLimits fields}
| (copy)
v
TrialSetup (table): trial_id, {TrialSetup & TrialResultLimits fields}
OPTION 2: Reference Spec Revision
[审判] 指向 [特殊]。绝不能修改 [SpecRev],而是创建新的修订版。对于覆盖和特殊测试,将创建一个新的 [SpecRev] 并将其标记为隐藏 (不适用于将来的试用)。
从技术上讲,这些一次性的SpecRev行实际上并不是现实世界中批准的规范修订。
OPTION 3: Suggestions?
Thoughts:
1.复制数据 “感觉” 像个坏主意,但快照 “感觉” 像个好主意。不确定为什么。
2.每个 [试验] 引用 [SpecRev] 都感觉更健壮。然而,如果一个 [SpecRev] 曾经被无意中修改过,那么每个引用它的 [试验] 现在都是不正确的。
专家解答
在我看来,您存储的是两个略有不同的东西:
-试验的规范
-用于试验的设置
事实是sometimes他们是一样的,除了重点。你在存储不同的事实。因此,每个试验都应该记录自己的设置和结果限制。
您还需要存储每个规范的设置和限制。
但这意味着TrialSetup & TrialResultLimits表有两个父母!真正的试验和规范。
这被称为多态关联。
我解决这个问题的首选方法是创建一个中间表。这是真实试验和规范的父级。
这将给出一个如下的模式:
根据你所说的,我还会:
-禁止更新规格。如果需要更改,请创建新的试用规范。
-有一个从真实试验到跟踪规格的FK。这允许您查找哪些值被覆盖。
-试验的规范
-用于试验的设置
事实是sometimes他们是一样的,除了重点。你在存储不同的事实。因此,每个试验都应该记录自己的设置和结果限制。
您还需要存储每个规范的设置和限制。
但这意味着TrialSetup & TrialResultLimits表有两个父母!真正的试验和规范。
这被称为多态关联。
我解决这个问题的首选方法是创建一个中间表。这是真实试验和规范的父级。
这将给出一个如下的模式:
create table trials (
trial_id int not null primary key,
trial_type varchar2(10) not null
check ( trial_type in ('REAL', 'SPEC') ),
unique ( trial_id, trial_type )
);
create table real_trials (
trial_id int not null primary key
references trials ( trial_id ),
trial_type varchar2(10) not null
check ( trial_type = 'REAL' ),
foreign key ( trial_id, trial_type )
references trials ( trial_id, trial_type )
);
create table trial_specs (
trial_id int not null primary key
references trials ( trial_id ),
trial_type varchar2(10) not null
check ( trial_type = 'SPEC' ),
foreign key ( trial_id, trial_type )
references trials ( trial_id, trial_type )
);
create table trail_setup (
trial_id int not null primary key
references trials ( trial_id ),
);
create table trail_result_limits (
trial_id int not null primary key
references trials ( trial_id ),
); 根据你所说的,我还会:
-禁止更新规格。如果需要更改,请创建新的试用规范。
-有一个从真实试验到跟踪规格的FK。这允许您查找哪些值被覆盖。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




