我正在学习如何设计数据库,并且我一直要求创建保存此表单的表:Medical History我正在学习使用Django / Python我已经在使用了标记HTML和CSS,但我不认为将表单上的每个问题都设为列是最好的方法。例如,在家族历史中,我曾想过将它作为一个单独的表格,而在系统评论中,我想让每个都成为一个集合。
答案 0 :(得分:1)
务实的方法是根据以下标准定义表格:
1)从中轻松选择数据(不要获取需要OR或字符串拆分的许多JOIN或复杂查询)
2)易于理解(每个概念映射到一个表)
=>通常,规范化结构可以解决这个问题
当然,上述内容在高事务环境(INSERT,UPDATE,DELETE)中受到挑战。
我认为你的案例有适度的INSERT,但有更多的SELECT(报告)。
对于家庭历史部分,我会将所有内容规范化:
DiseaseTypeId
Code -- use to separate from a name that can change in time
Name -- breast cancer, colon cancer etc.
CollateralOptionId
Code -- I would put UNIQUE constraints on Codes and Names
Name -- no, yes, father
FamilyHistoryId INT PK IDENTITY -- this may be missing, but I prefer if I use an ORM
PatientId -> FK -> Patient
DiseaseTypeId -> FK -> DiseaseType
CollateralOptionId FK -> CollateralOption
Checked BIT -- you may not define this and have records for Checked ones.
-- having this may put some storage pressure
-- but prevent some "stuffing" in the queries
例如,这些结构可以容易地为其家族中的结肠癌患者提供数量。
很简单:如果没有严重的理由反对它,请选择标准化结构。
答案 1 :(得分:0)
我没有看到在此数据结构上执行任何设计技巧的任何优势。是的,为每个复选框创建一个布尔属性,以及每个自由文本的字符串属性,将导致一个表中的大量属性。但这只是数据的逻辑结构。所有这些属性都取决于关键,某些人的身份,(或者至少我认为是医学外行人)。而且,我假设它们彼此独立,即不由某些其他属性组合确定。所以他们去了同一张桌子。将它们放在几张桌子上并没有获得任何好处,但是如果你查询不同类型的属性(比如母亲患有乳腺癌并且现在有乳房肿块的所有患者),会强迫你做很多连接。
通过制作一些属性,我不确切地知道你的意思。你的意思是只有一个属性,并编码布尔值的序列,例如在一个整数中,就像5表示是 - 不是?再一次,这不值得麻烦,因为它不会节省任何空间或其他任何东西,但会使查询更复杂。
如果您仍有疑问,请尝试为这些数据制定最常用的用例,这可能是对这些属性组合的典型查询。然后我们可能会看到一个不同的结构是否会让你的生活更轻松。