我正在尝试设计一个数据库模型,我有一个问题。
我需要代表这个:
订单可能有零个或一个QAP 订单可以有一个或多个电子报告 电子报告必须有一个QAP。
为了表示这一点,我有这个模型:
如果orden没有QAP,用户必须选择一个以将其添加到电子报告中。如果订单具有QAP,则用户无需选择一个将其添加到电子报表中,因为所有电子报表都将具有订单的QAP。
用户将收到一个Orden,然后他将填写电子报告。我对订单不感兴趣,我对用户填写的电子报告感兴趣,QAP有填写它的信息。
我的问题是如果订单没有QAP电子报告可能有不同的QAP 。
例如,Order1没有QAP,但它有两个电子报告:
此数据库设计是否正确?
我不确定订单表和电子报表中的重复qapId列是否正确。
答案 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
,如下所示:
如果Order.forOrder
为false,那么您的客户端应用可以将Order.qapId
解释为仅适用于子EReport
,否则它适用于Order
和{{ 1}} S上。
答案 2 :(得分:1)
由于EReports在强制Order获得QAP之前可以有不同的QAP,因此无法使用声明性参照完整性(单独)来表示您的约束。您现在拥有的模型是您需要使用的模型,结合一些程序逻辑来强加您的规则,即如果他们的订单有一个,则EReports必须共享相同的QAP。