繁体   English   中英

数据库设计 - 用于建立层次结构的表设计

[英]Database design - table design for modeling a hierarchy

我正在设计一个实验室信息系统(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,1个用于子组2,1个用于组件。 然后通过在此表中放置每个的外键来创建另一个表来合并所有这些表...唯一的权衡是该表中的某些行可能具有空值。 我对我的设计不满意,所以我希望有人可以就如何做到这一点给我建议; 任何帮助将不胜感激。

以下是几个选项:

如果它只是您正在建模的层次结构,并且没有涉及其他数据,那么您可以在两个表中执行此操作:

两个表模型

这样做的一个问题是你没有强制执行,例如, sub_group必须是sub_group的子lab_group ,或者component必须是sub_group_1sub_group_2sub_group_2 ,但是你可以在应用程序层中强制执行这些要求代替。

这种方法的优点是模式很简单。 即使实体具有与它们相关联的更多数据,仍然可能值得对这样的层次结构建模并且为实体本身设置一些单独的表。

如果要在数据级别强制执行正确的关系,则必须将其拆分为单独的表。 也许是这样的:

多桌子

这假设每个sub_group_1仅与单个lab_group 如果不是这种情况,则在lab_groupsub_group_1之间添加链接表。 同样,对于sub_group_1 - > sub_group_2关系。

componentsub_group_1sub_group_2之间存在单个链接表。 这允许单个component与多个sub_group_1sub_group_2实体相关联。 它是单个表的事实意味着很多sub_group_1_idsub_group_2_id记录将为null (就像您在问题中提到的那样)。 您可以阻止空值具有两个单独的链接表:

  • sub_group_1_component ,具有sub_group_1的外键和component的外键
  • sub_group_2_component ,具有sub_group_2的外键和component的外键

我没有把它放在图中的原因是,对我来说,不得不查询两个表而不是一个来获得所有component - > sub_group关系太麻烦了。 为了进行一些非规范化(允许一些nulls ),查询单个表要容易得多。 如果你发现自己允许大量的null (就像这里所有实体之间的关系的单个链接表)那么这可能是非常规的。

就个人而言,我会使用值的关系创建3个表。 它使您能够创建无限的值数组。 只是尽量确保你给出了很棒的专栏名称,否则你的头脑会旋转几天。 :)

此外,对于所有不同类型的连接,空值不是问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM