我有一些医疗信息我希望存储在关系数据库中,但不知道如何以最好的方式对其进行建模。
这里的问题是我有几个字段在其他字段中细分,同时细分为其他字段....
例如我有这个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)
);
当然这不是整个数据,因为有200个字段和14个类别......
对于具有更多细分的“肌肉骨骼系统”,采用这种方法是否正确?
还有其他方法来模拟这种情况,或者我需要有几个表,其中ID是指向其他表的指针,该表具有指向其他表的指针等等....
如果我想进行一个查询,给出一个包含所有“医学评估”数据的大表,那么最好的方法是什么,有几个加入ON id?
答案 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)
您正在谈论的是层次结构。如果我被要求这样做,我将提供两个表:数据和参考。
评估表
参考表
参考表包含以下内容:
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。您可以自己查找这个很酷的功能,也可以告诉我们您的数据库引擎,我们可以继续讨论。