Database design 承诺数据库的表设计

Database design 承诺数据库的表设计,database-design,Database Design,我正试图设计一个数据库来存储主管的承诺。该界面将通过web浏览器显示 我遇到的问题是,每个主管在其电子表格中当前跟踪的字段不同。这是因为每个主管的小组执行不同类型的工作(承诺) 我是否应该有一个包含所有字段的承诺表,并在更多主管使用该表并请求其字段时继续添加新的承诺表 我是否应该考虑承诺项目的内容?而是有一个通用的承诺表,然后有每种承诺类型的表来存储唯一的字段并使用联接?这些额外的表可能只有一两个字段 第三种选择可能是为每种类型的承诺提供单独的表,并在每个表中重复所有公共字段(StartDate

我正试图设计一个数据库来存储主管的承诺。该界面将通过web浏览器显示

我遇到的问题是,每个主管在其电子表格中当前跟踪的字段不同。这是因为每个主管的小组执行不同类型的工作(承诺)

我是否应该有一个包含所有字段的承诺表,并在更多主管使用该表并请求其字段时继续添加新的承诺表

我是否应该考虑承诺项目的内容?而是有一个通用的承诺表,然后有每种承诺类型的表来存储唯一的字段并使用联接?这些额外的表可能只有一两个字段


第三种选择可能是为每种类型的承诺提供单独的表,并在每个表中重复所有公共字段(StartDate、EndDate、Description)。

听起来您的场景中的承诺大多是半结构化/非结构化数据。您是否考虑过将它们存储为XML,或者使用与关系数据库一起运行的本机XML数据库


是一个很好的原生XML数据库,带有REST API,可以让您轻松查询承诺并在web浏览器中显示。

听起来您的场景中的承诺大多是半结构化/非结构化数据。您是否考虑过将它们存储为XML,或者使用与关系数据库一起运行的本机XML数据库


是一个很好的原生XML数据库,带有REST API,允许您轻松查询承诺并在web浏览器中显示。

这取决于:如果承诺是动态的,这意味着主管可以发明新的承诺,那么我希望有一个承诺类型表,其中包含与此类似的所有不同承诺:

 Table CommitmentType(Id, Description, ...)

 Table SupervisorCommitment(Id, CommitmentTypeId, SuperVisorId, StartDate, EndDate, ...)
这样,主管可以添加新的承诺类型,但他们也可以共享这些类型

更新:如果承诺也有不同的字段,那么更规范化的设计版本将有一个描述字段的
字段
表和一个CommitmentType-to-fields关系表(如果是m:n)或者字段表中的承诺类型id,以防您不想在承诺之间共享字段。像这样:

Table Field(Id, Name, TypeDescription, CommitmentTypeId)

通过这种方式,您可以为每个承诺创建新承诺和新字段

<>你也可以考虑使用一个面向文档的数据库,比如MangGDB或卡桑德拉,它在数据存储方式上有更灵活的方法。然而,它们还有其他缺点,在跳上“NoSQL”货车之前,您应该进行调查并仔细权衡

更新2:存储值之后可以进入
CommitmentFieldValue
表格,如下所示:

Table CommitmentFieldValue(CommitmentTypeId, FieldId, Value)

另外:仅仅因为您在db设计中具有创建新承诺类型和字段的灵活性,并不意味着您必须将其公开给UI。

这取决于:如果承诺是动态的,这意味着主管可以发明新的承诺类型,那么我会创建一个承诺类型表,其中包含与此类似的所有不同承诺:

 Table CommitmentType(Id, Description, ...)

 Table SupervisorCommitment(Id, CommitmentTypeId, SuperVisorId, StartDate, EndDate, ...)
这样,主管可以添加新的承诺类型,但他们也可以共享这些类型

更新:如果承诺也有不同的字段,那么更规范化的设计版本将有一个描述字段的
字段
表和一个CommitmentType-to-fields关系表(如果是m:n)或者字段表中的承诺类型id,以防您不想在承诺之间共享字段。像这样:

Table Field(Id, Name, TypeDescription, CommitmentTypeId)

通过这种方式,您可以为每个承诺创建新承诺和新字段

<>你也可以考虑使用一个面向文档的数据库,比如MangGDB或卡桑德拉,它在数据存储方式上有更灵活的方法。然而,它们还有其他缺点,在跳上“NoSQL”货车之前,您应该进行调查并仔细权衡

更新2:存储值之后可以进入
CommitmentFieldValue
表格,如下所示:

Table CommitmentFieldValue(CommitmentTypeId, FieldId, Value)

另外:仅仅因为您在db设计中具有创建新承诺类型和字段的灵活性,并不意味着您必须将其公开给UI。

我的想法是有一个通用的“承诺”表,其中包含所有常见数据和一个承诺类型字段。这样做的好处是,当您显示一个列表时,您可能不需要加入细节表


在查找详细信息时,可以加入正确的表。甚至可以做一些灵活的事情,比如将细节放在键/值表中。详细信息字段的类型和值都存储在其中,这使得添加新字段非常容易。

我的想法是创建一个通用的“承诺”表,其中包含所有常用数据和一个承诺类型字段。这样做的好处是,当您显示一个列表时,您可能不需要加入细节表

在查找详细信息时,可以加入正确的表。甚至可以做一些灵活的事情,比如将细节放在键/值表中。其中存储了详细信息字段的类型和值,使得添加新字段非常容易。

基本问题是“如何使用数据库存储多态数据?”;到目前为止,你已经得到了我所知道的所有可用答案:

  • 包含所有可能列的单个表(SQL)
  • 一个带有公共列的表,变量的单独表(SQL)
  • 每个变量一个表(SQL)
  • 实体/属性/值(SQL)
  • 文档(NoSQL)
要选择正确的解决方案,我建议考虑您的设计可能必须支持的查询类型,并确定如何在每个可用模型中编写这些查询

我猜你可能需要像“使用ove查找所有主管”这样的查询