1

我正在尝试设计一个数据库模型,但我有一个问题。

我需要表示这一点:

一个订单可能有零个或一个 QAP。
一份订单可以有一份或多份电子报告。
一份电子报告必须有一个 QAP。

为了表示这一点,我有这个模型:

在此处输入图像描述

如果一个订单没有 QAP,用户必须选择一个将其添加到电子报告中。如果订单有 QAP,用户不需要选择一个来将其添加到 E-Report,因为所有 E-Reports 都将具有该订单的 QAP。

用户将收到一个 Orden,然后他将填写 E-Reports。我对订单不感兴趣,我对用户填写的电子报告感兴趣,QAP 有填写所需的信息。

我的问题是,如果 Order 没有 QAP 电子报告可能有不同的 QAP
例如,Order1 没有 QAP,但它有两个 E-Report:

  • E-Report1 具有 QAP1,并且
  • E-Report2 有 QAP2。

这个数据库设计正确吗?

我不确定 Order 表和 E-Report 表中的重复 qapId 列是否正确。

4

3 回答 3

1

一个订单可能有零个或一个 QAP。

使 Order.qapid 成为可为空的外键将符合此要求。

一份订单可以有一份或多份电子报告。

使 EReport.orderid 成为不可为空的外键将满足该要求,但不太适合它。没有要求每个订单至少有一个 EReport 的声明方式。不过,您可以使用可更新的视图、触发器等来做到这一点。但是,您的意思是“每个订单必须至少有一个 EReport”并不十分清楚,这意味着 EReport 中的一行与 Order 中的一行同时创建。

一份电子报告必须有一个 QAP。

使 EReport.qaoid 成为不可为空的外键将符合此要求。

如果订单有 QAP,用户不需要选择一个来将其添加到 E-Report,因为所有 E-Reports 都将具有该订单的 QAP。

如果您将订单的 QAP 复制到 EReport,您可能会以错误的方式处理整个问题。你还说

我的问题是如果订单没有 QAP 电子报告可能有不同的 QAP。

这意味着每个订单只有一个 QAP。您可能需要在 Order 表中存储一个且仅一个 QAP,而在 EReport 表中根本不需要存储qapid。

于 2012-05-20T11:43:28.983 回答
1

由于在强制 Order 获得 QAP 之前,EReports 可以有不同的 QAP,因此无法使用声明性引用完整性(单独)来表示您的约束。您现在拥有的模型就是您需要使用的模型,结合一些程序逻辑来强加您的规则,即如果 EReports 的 Order 有一个 QAP,则它们必须共享相同的 QAP。

于 2012-05-23T19:35:22.640 回答
1

所以你想代表一种情况,Order没有QAP,但它是EReport,而且它必须是同一个?

好吧,既然EReportmust always have Order,你可以省略EReport.qapId和依赖Order.qapId,如下所示:

在此处输入图像描述

如果Order.forOrder为 false,那么您的客户端应用程序可以解释Order.qapId为好像它仅适用于 child EReports,否则它适用于两者OrderEReports。

于 2012-05-20T11:58:40.553 回答