冗余的关系?

时间:2012-05-20 06:30:52

标签: database database-design relational-database table-relationships

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

我需要代表这个:

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

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

enter image description here

如果orden没有QAP,用户必须选择一个以将其添加到电子报告中。如果订单具有QAP,则用户无需选择一个将其添加到电子报表中,因为所有电子报表都将具有订单的QAP。

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

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

  • E-Report1有QAP1和
  • E-Report2有QAP2。

此数据库设计是否正确?

我不确定订单表和电子报表中的重复qapId列是否正确。

3 个答案:

答案 0 :(得分:1)

  

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

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

  

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

使EReport.orderid成为一个不可为空的外键将容纳该要求,但不太适合它。没有声明方式要求每个订单至少有一个EReport。但可以使用可更新视图,触发器等来执行此操作。但是,你的意思是“每个订单必须至少有一个EReport”,这并不是很清楚,这意味着EReport中的一行与Order中的一行同时创建。

  

电子报告必须有一个QAP。

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

  

如果订单有QAP,则用户无需选择一个将其添加到QAP   电子报告,因为所有电子报告都有订单的QAP。

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

  

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

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

答案 1 :(得分:1)

所以你想表示Order没有QAP,但是EReport的情况,并且它必须是同一个?

好吧,由于EReport必须始终有Order,因此您可以省略EReport.qapId并依赖Order.qapId,如下所示:

enter image description here

如果Order.forOrder为false,那么您的客户端应用可以将Order.qapId解释为仅适用于子EReport,否则它适用于Order和{{ 1}} S上。

答案 2 :(得分:1)

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