1

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

4

2 回答 2

2

这里有几个选项:

如果只是在建模上面的层次结构,并且没有涉及其他数据,那么您可以在两个表中进行:

两表模型

这样做的一个问题是您没有强制要求,例如,asub_group必须是 a 的子级lab_group,或者 acomponent必须是 asub_group_1或 a 的子级sub_group_2,但是您可以在应用程序层中强制执行这些要求。

这种方法的优点是模式很好而且简单。即使实体有更多与之关联的数据,仍然值得像这样对层次结构进行建模,并为实体本身提供一些单独的表。

如果您想在数据级别强制执行正确的关系,那么您将不得不将其拆分为单独的表。也许是这样的:

多表

这假设 eachsub_group_1仅与单个lab_group. 如果不是这种情况,则在lab_group和之间添加一个链接表sub_group_1。对于sub_group_1->sub_group_2关系也是如此。

componentsub_group_1和之间有一个链接表sub_group_2。这允许单个component与多个实体相关sub_group_1联。sub_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),查询单个表要容易得多。如果您发现自己允许很多nulls (例如此处所有实体之间关系的单个链接表),那么这可能是非规范化太多了。

于 2012-08-18T08:18:02.543 回答
1

就个人而言,我会使用值的关系创建 3 个表。它使您能够创建无限的值数组。试着确保你给出了很好的列名,否则你的头会旋转好几天。:)

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

于 2012-08-18T02:19:56.037 回答