如果我的 Java 代码中有以下类:
Patient
:包含花药类的实例(如下所述) PatientBasicInformation
: 包含 PatientId、phoneNumber、Name、Gender、Age。PatientImageFinidgns
: 包含日期、评论、病变大小、部位、程序。PatientLabFindings
: 包含日期、t1、t2、t3、t4。PatientTreatment
: 包含visitNumber、Date 和一些其他数据。Id
是主键Patient
和Date
是两个非常重要的关键PatientImageFindings
和PatientLabFindings
。visitNumber
是我的主键PatientTreatment
。
我怎么能在数据库中设计这些类。我应该创建一个 table Patient
,它只包含其他类的外键(如ID
, Date
, VisitNumber
),还是应该将PatientId
表Patient
作为主键和表中的外键放入PatientBasicInformation
表中。如果是这样,PatientBasicInformation
表中的主键是什么?
我想要一个简单而明确的答案,因为我是数据库的新手,并且我已经阅读了很多文章,但我仍然没有了解全貌。
简而言之,您应该设计您的数据库,以便所有信息都以其自然的层次进行存储。
在你的情况下,我会创建一个 table Patients
。在该表中的每一行应该存储所有是相关的是患者和的信息不依赖于其他任何东西。其他表随后也随之而来。例如,PatientVisits
唯一键是访问的标识符;但是您需要知道这次访问与哪个患者有关,因此您还应该有一个外键回到Patients
. 您的架构看起来像这样:
耐心
永远不要存储年龄,你必须每天重新计算它。而是存储出生日期,以便您可以轻松计算出当前年龄。
图像发现
Patients
我已重命名为date
,created
因为它是一个保留字,在数据库中使用确实很混乱。我怀疑这应该是主键,因为可以同时插入两个
实验室发现
Patients
Tests
如果图像依赖于 LabFinding,那么您应该将外键更改ImageFindings
为LabFindings
. 由于您可能有 1 个以上的测试,因此应将这些测试拆分为行而不是列,因为您可能会添加更多测试。
治疗
Patients
您注意到每个表的主键都是代理键。这是因为没有自然键,即显然应该是表的主键。你问PatientBasicInformation
( Patients
)的主键应该是什么;它不能是任何东西,但一个代理键,你不能靠,你永远不会有相同的名称,另一个,或者相同的名字和出生日期,患者等人的命名惯例本质上是混乱等等你不能相信人们会很好地融入你的数据库。
我强烈建议阅读第三范式并尝试理解它。
这侧重于您的问题和指定的课程。我不确定LabFindings
是否正确标准化,那些 t1,t2,t3.. 听起来很可疑,但我们需要对此进行更详细的解释。