我的客户已经指定,当满足内部逻辑中的某些条件时,他需要执行不同的操作。每个操作类型(到目前为止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
我的问题是我不能拥有多个关系表,因为我无法保证跨多个表的操作顺序。我不能在输出表(客户要求)中为每个单独的操作设置多个具有外键的列。使用上面的设置,我不能具有引用完整性,导致我的应用程序中可能ConfigurationException
由于外键条目没有输出相应的主键。
是否有一种设计可以实现参照完整性并设法保证引用操作的顺序?
答案 0 :(得分:1)
如果客户允许,您可以将计算列添加到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参考的来源。我仍然觉得客户的这种约束有点令人困惑 - 当然你应该能够定义架构,使其中包含的数据显然是正确的 - 其他任何东西都会在将来引发完整性问题。
答案 1 :(得分:1)
"..when certain conditions in an internal logic are met"
被称为商业活动。
答案 2 :(得分:0)
两种可能性:
您是否可以在命令和WriteVariable表中添加OrderingId列,以确定要执行的操作的顺序?您需要以编程方式确保所使用的orderingIds正确增加,因为DB无法确保跨表的唯一性,因此在应用程序代码或触发器/存储过程中执行此操作
拥有一个带有orderingID的Action表(这可能是您的OutputTable表)
答案 3 :(得分:0)
我真的没有看到问题....你已经有OutputTable
来定义序列,对吗?输出表上还有ActionID
。
现在,CommandTable
和WriteVariableTable
等每个“子”表都应该引用OutputTable.ActionID
。在SQL Server中,要执行此操作,您需要在UNIQUE INDEX
上放置ActionID
,然后您可以定义:
ALTER TABLE dbo.CommandTable
ADD CONSTRAINT FK_CommandTable_OutputTable
FOREIGN KEY(CommandID) REFERENCES dbo.CommandTable.ActionID
和
ALTER TABLE dbo.WriteVariableTable
ADD CONSTRAINT FK_WriteVariableTable_OutputTable
FOREIGN KEY(WriteVariableID) REFERENCES dbo.CommandTable.ActionID
现在你有了参照完整性,完全检查了 - 你在OutputTable
上定义了序列,你可以扩展它以包含其他动作类型的其他“子”表......
答案 4 :(得分:0)
可能有无数种方法可以做到这一点。根据我的经验,为每种类型的操作设置单独的表会增加复杂性并使添加新操作变得困难。您可能需要考虑以下内容:
LogicTable
* OutputID
* Description
OutputTable <== a pure relational table
* OutputID
* LogicID
* ActionID
* ActionTypeID
* Sequence
ActionTypeTable
* ActionTypeID
* Description
Actions
* ActionID - primary key
* Sequence - not null
-- other columns as necessary to support the various
actions, e.g. Command and WriteVariable
如果Actions中的某些列没有用于每种不同类型的操作,那很好 - 一些空字段不会伤害任何东西。或者,您可以使用更通用的设计,例如
Actions
* ActionID - primary key
* Sequence - not null
ActionArguments
* ActionID - foreign key to Actions, part of primary key
* ArgumentName - not NULL, part of primary key
* ArgumentValue
只是一些想法。
分享并享受。
答案 5 :(得分:0)
简单地说,是的,我相信你的外键已经倒退了。这就是我想到的: