我的客户已指定,当满足内部逻辑中的某些条件时,他需要执行不同的操作。每种操作类型(到目前为止CommandWriteVariable)都有一组特定的特定信息,因此需要存储在一个单独的表中。用户必须能够定义执行动作的顺序。

我为数据库设置了以下设置:

LogicTable
* OutputID
* Description

OutputTable <== a pure relational table
* OutputID
* LogicID
* ActionID <== this references one of the action tables (Command/WriteVariable)
* ActionTypeID
* Sequence

ActionTypeTable
* ActionTypeID
* Description

CommandTable
* CommandID  <== corresponds to ActionID in OutputTable
three columns with further command-specific information

WriteVariableTable
* WriteVariableID  <== corresponds to ActionID in OutputTable
four columns with further write-variable-specific information


我的问题是我不能有多个关系表,因为我不能保证多个表之间的动作顺序。我不能在输出表中(客户要求)使用多列外键指向每个单独的动作。使用上述设置,我无法具有参照完整性,由于外键输入w / out对应的主键输入,导致我的应用程序中可能出现ConfigurationException

是否有一种设计可以启用参照完整性并设法保证参照动作的顺序?

最佳答案

如果客户允许,您可以将计算列添加到OutputTable表,例如

create table OutputTable (
  OutputID <datatype> <nullability>,
 LogicID <datatype> <nullability>,
 ActionID <datatype> <nullability>,
 ActionTypeID <datatype> <nullability>,
 Sequence <datatype> <nullability>,
  CommandActionID as CASE WHEN ActionTypeID = <Command Action> then ActionID END PERSISTED,
  WVActionID as CASE WHEN ActionTypeID = <Write Variable Action> then ActionID END PERSISTED,
    constraint FK_Output_CommandActions FOREIGN KEY (CommandActionID) references CommandTable (CommandID)
)


然后,您可以将这些计算出的列用作FK引用的来源。但是,我仍然从客户那里发现此约束有点令人困惑-当然,您应该能够定义架构,以使其中包含的数据显然是正确的-将来任何其他情况都会引发完整性问题。

关于c# - SQL表引用多个外键,同时定义顺序并确保引用完整性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4562067/

10-11 05:13