我正在设计实验室信息系统(LIS),并对如何为不同的实验室测试设计表格感到困惑。我应该如何处理具有多个值的属性的表,并且该属性的多个值中的每个值也可以具有多个值?
以下是我的LIS设计中的一些数据......
HEMATOLOGY <-------- Lab group
**************************************************************
CBC <-------- Sub group 1
RBC <-------- Component
WBC
Hemoglobin
Hematocrit
MCV
MCH
MCHC
Platelet count
Hemoglobin
Hematocrit
WBC differential
Neutrophils
Lymphocytes
Monocytes
Eosinophils
Basophils
Platelet count
Reticulocyte count
ESR
Bleeding time
Clotting time
Pro-time
Peripheral smear
Malarial smear
ABO
RH typing
CLINICAL MICROSCOPY <-------- Lab Group
**************************************************************
Routine urinalysis <-------- Sub group 1
Visual Examination <-------- Sub group 2
Color <-------- Component
Turbidity
Specific Gravity
Chemical Examination
pH
protein
glucose
ketones
RBC
Hbg
bilirubin
specific gravitiy
nitrite for bacteria
urobilinogen
leukocyte esterase
Microscopic Examination
Red Blood Cells (RBCs)
White Blood Cells (WBCs)
Epithelial Cells
Microorganisms (bacteria, trichomonads, yeast)
Trichomonads
Casts
Crystals
Occult Blood
Pregnancy Test
......我的设计中的其他实验室分组(例如血液化学,血清学等)也会重复这种数据层次......
另一个问题是,我如何处理可能是一个或多个实验室小组成员的组件(例如RBC)?
我已经通过制作单独的表实现了我的问题的解决方案,实验室组1,子组1 1,子组2 1和组件1。然后通过在此表中放置每个的外键来创建另一个表来合并所有这些表...唯一的权衡是该表中的某些行可能具有空值。我对我的设计不满意,所以我希望有人可以就如何做到这一点给我建议;任何帮助将不胜感激。
答案 0 :(得分:2)
以下是几个选项:
如果它只是上面的层次结构,你正在建模,并且没有涉及其他数据,那么你可以在两个表中完成:
这样做的一个问题是你没有强制执行,例如,sub_group
必须是lab_group
的孩子,或者component
必须是sub_group_1
或sub_group_2
,但您可以在应用层中强制执行这些要求。
这种方法的优点是模式很简单。即使实体拥有更多与之关联的数据,仍然可能值得对此类层次结构进行建模,并为实体本身设置一些单独的表。
如果要在数据级别强制执行正确的关系,则必须将其拆分为单独的表。也许是这样的:
这假定每个sub_group_1
仅与单个lab_group
相关。如果不是这种情况,请在lab_group
和sub_group_1
之间添加一个链接表。同样适用于sub_group_1
- &gt; sub_group_2
关系。
component
与sub_group_1
和sub_group_2
之间只有一个链接表。这允许单个component
与多个sub_group_1
和sub_group_2
实体相关联。事实上它是一个单独的表意味着很多sub_group_1_id
和sub_group_2_id
记录将是null
(就像您在问题中提到的那样)。您可以阻止空值具有两个单独的链接表:
sub_group_1_component
,其中包含sub_group_1
的外键和component
的外键sub_group_2_component
,其中包含sub_group_2
的外键和component
的外键我没有把它放在图表中的原因是,对我来说,不得不查询两个表而不是一个表来获取所有component
- &gt; sub_group
关系太痛苦了。为了进行一些非规范化(允许一些nulls
),查询单个表要容易得多。如果你发现自己允许了很多null
s(就像这里所有实体之间关系的单个链接表那样),那么这可能是非正规化的。
答案 1 :(得分:1)
就个人而言,我会使用值的关系创建3个表。它使您能够创建无限的值数组。只是尽量确保你给出了很棒的专栏名称,否则你的头脑会旋转几天。 :)
此外,对于所有不同类型的连接,空值不是问题