数据库设计,使一个表指向几个和某种递归指针

时间:2013-03-06 03:43:19

标签: mysql sql database-design join innodb

我有一些医疗信息我希望存储在关系数据库中,但不知道如何以最好的方式对其进行建模。

这里的问题是我有几个字段在其他字段中细分,同时细分为其他字段....

例如我有这个sql代码:

 CREATE TABLE Distribution_patterns(
              id_Distribution_pattern  INTEGER  NOT NULL PRIMARY KEY,
              LEFT_SIDE_VIEW           VARCHAR(40)  NOT NULL,
              RIGHT_SIDE_VIEW          VARCHAR(40)  NOT NULL,
              dorsal_view              VARCHAR(10 ) NOT NULL,
              ventral_ view            VARCHAR(10 ) NOT NULL,              
              CONSTRAINT uc_Info_d_p UNIQUE (id_Distribution_pattern)           
            );


CREATE TABLE lymph_nodes (
              id_lymph_nodes       INTEGER  NOT NULL PRIMARY KEY,
              MANDIBULAR           VARCHAR(40)  NOT NULL,
              scapular             VARCHAR(40)  NOT NULL,
              INGUINAL             VARCHAR(10 ) NOT NULL,
              popliteal            VARCHAR(10 ) NOT NULL,              
              CONSTRAINT uc_Info_l_n UNIQUE (id_lymph_nodes)           
            );

CREATE TABLE evaluation(
          ID_evaluation            INTEGER  NOT NULL PRIMARY KEY,
          Distribution_pattern     INTEGER ,
          lymph_node               INTEGER ,
          Musculoskeletal_system   INTEGER ,
          FOREIGN KEY (Distribution_pattern) references Distribution_patterns (id_Distribution_pattern),
          FOREIGN KEY (lymph_nodes)    references lymph_nodes (id_lymph_node),
          FOREIGN KEY (Musculoskeletal_system) references Musculoskeletal_system_parts (id_Musculoskeletal_system),
          CONSTRAINT uc_Info_evaluation UNIQUE (ID_evaluation)           
        );
  • 分布模式
    • 左侧视图
    • 右侧视图
    • 背面观
    • 腹侧视图
  • 淋巴结
    • 颌骨
    • 肩胛
    • 腹股沟
    • popliteal
  • 肌肉骨骼系统
    • 步态评估
    • TROT的评估
    • 触诊
      • TIP胸部
        • 肘部和前臂
        • CARPO和FINGERS
      • TIP骨盆
        • 骨盆
        • KNEE
        • HOCK
      • 具体测试
        • CAJON TEST
        • Ortolani TEST
        • OTHER

当然这不是整个数据,因为有200个字段和14个类别......

对于具有更多细分的“肌肉骨骼系统”,采用这种方法是否正确?

还有其他方法来模拟这种情况,或者我需要有几个表,其中ID是指向其他表的指针,该表具有指向其他表的指针等等....

如果我想进行一个查询,给出一个包含所有“医学评估”数据的大表,那么最好的方法是什么,有几个加入ON id?

2 个答案:

答案 0 :(得分:1)

这是一个潜在的大型数据库架构,因此我将专注于Musculoskeletal系统。不过,在我开始讨论之前,我应该提到数据库规范化的重要性。这一点很重要!并且有很多原因。首先,通过设计一个良好的,规范化的数据库,您现在可以在保证数据的完整性和可靠性的同时避免出现问题。始终牢记“这个数据库将如何发展”,“如果我需要添加更多系统或视图或分发模式怎么样”等等。做你自己,你的雇主,帮忙并阅读。简要概述可在此处阅读:http://databases.about.com/od/specificproducts/a/normalization.htm

到数据库设计:

您希望将作为其他列的子集的冗余列和列保留在表中并放入其自己的列中。例如,查看您的淋巴结表。如果一年后您意识到需要添加另一个淋巴结怎么办?或删除一个?或者,如果您只查看客户端的一个节点,该怎么办?而不是按照自己的方式进行操作,将桌子绑在一个较大的物体上(我不是医生,所以我不确定是什么,比如患者或淋巴系统)。或两者。例如:

患者有许多系统(患者台和系统台之间的一对多关系) 淋巴系统有许多器官(淋巴系统与器官之间有一对多的关系) 系统或器官有许多测试(系统和测试之间的一对多关系)。

示例:

  

<强> TablePatient

     

PatientId(int PK)

     

PatientFName(字符串)

     

PatientLName(字符串)

此表应仅包含与个体患者相关的数据

  

<强> TableSystems

     

SystemId(int PK)

     

的SystemName(字符串)

     

SystemDescription(字符串)

此表应仅包含特定于所有系统的列。系统可能是淋巴系统,呼吸系统,排泄系统等。

<强> TablePatient_TableSystems

  

Patient_System_ID(int PK)

     

PatientID(int FK)

     

SystemID(int FK)

你不能拥有多对多的关系。该表解决了这个问题。如果您没有这个,则需要在每个患者/系统的每个表中保留冗余记录

  

<强> TableOrgans

     

OrganID(int PK)

     

OrganName(字符串)

     

OrganDesc(字符串)

     

<强> TableOrgan_TableSystem

     

Organ_SystemID(int PK)

     

OrganID(int FK)

     

SystemID(int FK)

解决系统和器官的多对多

现在进行测试。是针对器官或系统的特定测试吗?或两者?这个例子会说两个

<强> TableTest

  

TestID

     

测试名

     

TestDesc

     

TestCost

     

<强> Tabel_Test_Stytem

     

TestSytemID(int PK)

     

TestID(int FK)

     

SystemID(int FK)

     

Tabel_Test_Organ

     

TestSytemID(int PK)

     

TestID(int FK)OrganId(int FK)

这里有很多,所以我认为这是一个停下来的好地方。阅读数据规范化,当您有问题时,请回到这里(或给我留言)。

答案 1 :(得分:1)

您正在谈论的是层次结构。如果我被要求这样做,我将提供两个表:数据和参考。

评估表

  • EvaluationId
  • PartId
  • EvaluationText

参考表

  • PARTID
  • 的GroupId
  • PartDesc

参考表包含以下内容:

PartId  GroupId PartDesc
0   null    Evaluation
1   0   Distribution pattern
2   1   LEFT SIDE VIEW
3   1   RIGHT SIDE VIEW
4   1   dorsal view
5   1   Ventral view
6   0   lymph nodes
7   6   MANDIBULAR
8   6   scapular
9   6   INGUINAL
10  6   popliteal
11  0   Musculoskeletal system
12  11  Gait assessment
13  11  VALUATION OF TROT
14  11  PALPATION
15  14  TIP thoracic
16  15  Elbow and forearm
17  15  CARPO AND FINGERS
18  14  TIP pelvic
19  18  PELVIS
20  18  KNEE
21  18  HOCK
22  11  specific tests
23  22  CAJON TEST
24  22  Ortolani TEST
25  22  OTHER

现在我们有一个整洁的表可供使用。我们如何使用它?好吧,递归CTE,当然。你没有提到数据库引擎,但几乎每个主要的DBMS都可以做到,除了MySQL。您可以自己查找这个很酷的功能,也可以告诉我们您的数据库引擎,我们可以继续讨论。