这取决于:如果承诺是动态的,这意味着主管可以发明新的承诺,那么我会选择一个包含所有不同承诺的承诺类型表:
Table CommitmentType(Id, Description, ...)
Table SupervisorCommitment(Id, CommitmentTypeId, SuperVisorId, StartDate, EndDate, ...)
这样,主管可以添加新的承诺类型,但也可以共享它们。
更新:如果承诺也有不同的字段,那么更规范化的设计版本将是还有一个描述字段的 Field 表和一个 CommitmentType 到字段的关系表(以防万一它是 m:n) 或字段表中的承诺类型 ID,以防您不想在承诺之间共享字段。像这样:
Table Field(Id, Name, TypeDescription, CommitmentTypeId)
或
Table Field(Id, Name, TypeDescription)
Table CommitmentTypeFields(FieldId, CommitmentTypeId)
这样您就可以为每个承诺创建新承诺和新字段。
您还可以考虑使用像 MongoDb 或 Cassandra 这样的面向文档的数据库,它们在数据存储方式上具有更灵活的方法。但是,它们还有其他缺点,您应该在跳上“NoSQL”大车之前调查并仔细权衡。
更新 2:然后可以像这样将值存储到 CommitmentFieldValue 表中:
Table CommitmentFieldValue(CommitmentTypeId, FieldId, Value)
另外:仅仅因为您在数据库设计中具有创建新承诺类型和字段的灵活性并不意味着您必须将其公开给 UI。