我正在设计一个记录保存系统的数据库。系统有4种类型的记录/表格。
这是我的设计
首先,这4个表单有常见的输入字段,如姓名、年龄和地址。我将这些公共输入字段分隔在一个表中,并添加一个外键。
例如: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..
基本上是这样的。
Form_fk_id
-连接公共输入字段表和表单表的外键
Form_type_number
-这将有助于了解要检索的格式。
您不希望在公共表中使用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,并根据表单类型将正确表中的详细信息连接到它。
实际上,我将有三个视图,每个视图显示每个表单的完整细节。视图上的触发器将允许应用程序代码操作每种类型的表单,就好像表单数据在一个完整的行中,而不是在两个表中分开。这将从应用程序中隐藏结构并确保结构被正确维护。