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

Mysql 数据库设计-用于层次结构建模的表设计,mysql,sql,database,database-design,erd,Mysql,Sql,Database,Database Design,Erd,我正在设计一个实验室信息系统(LIS),对如何为不同的实验室测试设计表格感到困惑。我应该如何处理具有多个值的属性的表,并且该属性的多个值中的每个值也可以具有多个值 这是我的LIS设计中的一些数据 HEMATOLOGY <-------- Lab group ************************************************************** CBC <-------- Sub group 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 

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


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

这里有几个选项:

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

这样做的一个问题是,您没有强制执行,例如,
子组
必须是
实验室组
的子级,或者
组件
必须是
子组1
子组2
的子级,但您可以在应用层中强制执行这些要求

这种方法的优点是模式好且简单。即使实体有更多的相关数据,也可能值得像这样对层次结构进行建模,并为实体本身创建一些单独的表

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

这假设每个
子组\u 1
仅与单个
实验室组相关。如果不是这样,则在
lab_组
sub_组
之间添加一个链接表。同样,对于
子组\u 1
->
子组\u 2
关系

组件
子组_1
子组_2
之间有一个链接表。这允许单个
组件
与多个
子组1
子组2
实体相关。事实上,它是一个单独的表,这意味着许多
sub_group_1_id
sub_group_2_id
记录将
null
(就像您在问题中提到的那样)。您可以防止空值具有两个单独的链接表:

  • sub_group_1_组件
    ,外键指向
    sub_group_1
    ,外键指向
    组件
  • sub_group_2_组件
    ,外键指向
    sub_group_2
    ,外键指向
    组件

我没有把这个放在图表中的原因是,对我来说,必须查询两个表而不是一个表才能获得所有
组件
->
子组
关系太痛苦了。为了实现一点非规范化(允许几个
null
),查询单个表要容易得多。如果您发现自己允许大量的
null
s(如用于所有实体之间关系的单个链接表),那么这可能是非规范化太多了。

Hi,首先我要感谢您的回复,我一直在考虑你的第二个建议,因为这应该是我设计中的第一个方法,但正如你所说的,在查询两个表而不是一个表时,我遇到了一些问题。我没有使用这种方法的另一个原因是,我不能使用诸如“查找属于某个实验室组的组件列表”之类的查询在这种设计中,在lab_组和组件之间设置关系是否错误?如果可能,我会尽量避免在
lab_组
组件
之间设置外键。原因是它复制了数据,你不再有单一的真相来源。如果您的
lab_组
->
组件
关系与您的其他关系不同步,这可能是一种痛苦,您相信哪一种关系?您应该能够编写查询来获取单个lab_组的所有组件,而无需添加任何新关系。以下是一个例子: