我正在设计记录保存系统的数据库。 该系统有4种记录/表格。
这是我的设计。
首先,4个表单具有公共输入字段,例如名称,年龄和地址。我将表中的这个公共输入字段分开并添加一个外键。
例如:
MUL
基本上,它看起来就像那样。
1/3-1
- 将连接公共输入字段表和表单
common_fields
ID
Name
Age
Address
Form_fk_id (foreign key to what form)
Form_type_number(this will define what kind of form the user used)
form1
ID
Birthdate
Occupation
etc..
form 2
ID
Mother_name
Father_name
etc..
form 3
ID
School_address
School_name
etc..
- 这对于了解要检索的表单非常有用。
我不确定这个设计。我不知道这是否是最好的设计方式。
答案 0 :(得分:1)
您不希望公用表中的FK引用。公用表将具有键和类型指示符,详细信息表将使用其 FK参考。
common_fields
ID
Form_type (defines what kind of form) must contain 1, 2 or 3
Name
Age
Address
constraint UQ_Common_Fields_ID_Type unique( ID, Form_Type )
唯一约束使FK引用(ID,Form_Type)成为可能。
form1
ID
Form_fk_id (with ID, FK to common) must contain 1
Birthdate
Occupation
etc..
form2
ID
Form_fk_id (with ID, FK to common) must contain 2
Mother_name
Father_name
etc..
form3
ID
Form_fk_id (with ID, FK to common) must contain 3
School_address
School_name
etc..
假设Form_Type字段是小整数,并且在公共表中仅限于值(1,2,3)。在Form1表中,该字段仅限于值1,仅在Form2中为2,在Form3中仅限于3。
创建新表单时,公共数据将插入到Common_Fields表中,从而为ID生成唯一值。 Form_Type字段包含值1,2或3,具体取决于表单类型。
假设值为1,因此匹配记录只能插入到Form1表中。
具有相同ID值的条目无法写入任何其他表单表。 Form_Fk_Id的值为1将不被允许,因为每个表都有一个检查约束,以确保该字段必须包含正确的值。除1以外的值将无法在公用表中找到匹配的值集。
这使得在公共表中定义为特定表单类型的表单只能在正确的表单表中具有关联的条目。
当用户想要查看表单123的详细信息时,在公用表中找到123,并根据表单类型从正确的表中加入详细信息。
实际上,我会有三个视图,每个视图显示每个表单的完整细节。视图上的触发器将允许应用程序代码操作每种类型的表单,就好像表单数据在一个完整的行中而不是在两个表中分解。这会隐藏应用程序的结构,并确保正确维护结构。