表中子集内子集的数据库设计

时间:2013-05-04 05:13:57

标签: mysql sql database

我有一个骨骼肌系统的描述,但我不知道最好的方法,因为这个系统有几个子集,碰巧有子集,如:

骨骼肌系统

  • 动物在车站的位置
  • 评估进展
  • 小跑的估价
  • 探测
    • 提示胸部
      • 地区Escapolohumeral
      • 手肘和前臂
      • Carpo And Fingers
    • 骨盆肢体
      • 骨盆
    • 特定测试
      • 抽屉测试
      • 测试Ortolani
      • 其他

然后我有一张病人桌

患者

  • ID
  • 名称
  • L_Name

然后我有一个包含所有系统的表(骨骼肌系统是其中的一部分)

系统

  • 骨骼肌系统
  • 神经系统
  • 泌尿系统
  • 呼吸

所以我正在做类似

的事情
DROP TABLE IF EXISTS `tbl_systems`; 
CREATE TABLE `tbl_systems` (
 id_system INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
 name_system VARCHAR(25)    
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
INSERT INTO `tbl_systems` VALUES (1,'Skeletal_Muscle');
INSERT INTO `tbl_systems` VALUES (2,'Nervous');
INSERT INTO `tbl_systems` VALUES (3,'Urinary');
INSERT INTO `tbl_systems` VALUES (4,'Respiratory');

DROP TABLE IF EXISTS `tbl_patient`; 
CREATE TABLE `tbl_patient` (
 id_patient INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
 name_patient VARCHAR(25) NOT NULL DEFAULT "not available",
 l_name_patient VARCHAR(25) NOT NULL DEFAULT "not available"
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tbl_patient` VALUES (1,'Joe', 'Doe');

DROP TABLE IF EXISTS `tbl_systems_patient`; 
CREATE TABLE `tbl_systems_patient` (
 id_patient_system INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 
 id_system INTEGER NOT NULL,
 id_patient INTEGER NOT NULL,
 FOREIGN KEY (id_system) REFERENCES `tbl_systems` (id_system),
 FOREIGN KEY (id_patient) REFERENCES `tbl_patient` (id_patient)   
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

INSERT INTO `tbl_systems_patient` VALUES (1,1,1);

DROP TABLE IF EXISTS `tbl_Skeletal_Muscle`; 
CREATE TABLE `tbl_Skeletal_Muscle` (
 id_system INTEGER NOT NULL,
 Position_In_Station VARCHAR(25) NOT NULL DEFAULT "not available",
 Assessment_Of_Progress VARCHAR(25) NOT NULL DEFAULT "not available",
 Valuation_Of_Trot VARCHAR(25) NOT NULL DEFAULT "not available", 
 Probing VARCHAR(25) NOT NULL DEFAULT "not available"
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
INSERT INTO `tbl_Skeletal_Muscle` 
 VALUES (1,'Normal','no progress','no change','failed');
  • 如何将tbl_Skeletal_Muscle与患者(id_patient)相关联并获取相应的结果,浏览这些表格?

  • 方法是否正确或有更好的选择?

  • 如何添加tbl_Skeletal_Muscle的缺失数据?我创建其他表吗?有多少?

请查看sqlfiddle

1 个答案:

答案 0 :(得分:1)

您的问题是,您正在尝试将与患者相关的信息与描述您的系统的信息混合在一起。

现在让我们假设骨骼肌系统中的层次结构与您的数据库并不十分相关,而是更多的呈现问题。同样适用于其他系统。

然后,您可以为每个系统创建一个表,每个表都有一个患者的外键,并且包含所有所需的列,而不管层次结构如何。在这种情况下,Systems信息将包含在表格布局本身中,添加另一个系统将需要添加另一个表格。根本不需要系统表。乍一看,Systems看起来确实应该成为设计的一部分,因为很少有患者的系统会有所不同; - )

如果您想要在该表中表达骨骼肌系统的层次结构,您可以添加父列,例如, Tip Thoracic的父母将是Probing。我仍然相信这是一个坏主意,因为这种父母关系对于所有患者都是相同的,因此不会传达任何与患者相关的信息。

您可以将包含系统层次结构的表添加到其组件中(动物站位置,...)。这个表更像是一个配置表,它描述了您的系统(而不是患者)。但是,您也可以在应用程序代码或其他配置文件中捕获此层次结构。