我的客户已指定,当满足内部逻辑中的某些条件时,他需要执行不同的操作。每种操作类型(到目前为止Command
和WriteVariable
)都有一组特定的特定信息,因此需要存储在一个单独的表中。用户必须能够定义执行动作的顺序。
我为数据库设置了以下设置:
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/