(我正在使用Microsoft SQL Server 2014)
我的公司收到包含许多帐户(tblFile
)的数据文件(tblAccount
)。对于每个数据文件,我们可能会执行多个“pricings”(tblPricing
),这些“pricings”可能包含文件中的所有帐户,或者只包含其中的一部分,但“pricings”不能包含任何帐户不在定价所依据的文件中。所以,总结一下:
到目前为止有效:
tblFile
和tblPricing
tblFile
和tblAccount
之间的多种关系(一个帐户可以存在于多个文件中)tblPricing
和tblAccount
之间的许多关系(因为可以执行许多定价,许多定价中都存在一个帐户)我们的问题来自于尝试在文件所具有的帐户子集与定价所具有的帐户子集之间实施完整性。使用上述结构,tblPricingAccounts
可以包含tblFileAccounts
中未包含的帐户,违反了我们对每个定价的需要,以便仅包含其所基于的文件中的帐户。
我尝试更改外键关系,我打破了tblPricingAccounts
和tblAccount
之间的链接,从tblPricingAccounts
删除了'acct_id',而是将tblPricingAccounts
链接到tblFileAccounts
(是的,我知道我需要tblFileAccounts
中的主键,我有一个主键。但是,然后我能够在tblPricingAccounts
中插入我想要的任何'pricing_id'。现在,我可以将帐户链接到与最初包含这些帐户的文件无关的定价。
在一天结束时,我不关心我的数据库的结构或关系是什么样的。我只需要满足以下条件,而我似乎无法理解它:
感谢任何帮助,我对所有可以在SQL Server中执行的建议持开放态度。最终我正在围绕这个数据库构建一个Web应用程序,我正在使用Entity Framework 6来简化生活(主要是......)。我显然可以通过我的代码强制执行上述3个需求,但我真的希望数据库成为强制执行此完整性的最后一道防线。
答案 0 :(得分:1)
听起来tblFileAccounts
可能是多余的。尝试完全删除它,并通过tblPricingAccounts和tblPricing中捕获的关系推断哪些文件存在于哪些文件中。
如果这符合您的需要,并且没有合法属于tblFileAccounts对象(表)的属性(列),那么我认为您的问题已经解决。
答案 1 :(得分:1)
这是外键约束无意处理的情况。 FK约束测试表之间是否存在值;他们没有强制执行特定的基数要求。
简单的基数是"一对多","多对多"问题中提到的关系。您更复杂的需求仍然主要是关于基数:它要求某些行的子集以特定方式与某些行的其他子集相关。 "窗口基数"如果你愿意的话。 (就我所知,我自己的造币。)
正如对问题的评论中所建议的,在数据库中完全强制执行此操作的一种方法是通过触发器。在这种情况下,精心设计的触发器可能会测试要插入的新行是否有效,如果没有插入则不会插入错误。对于批量插入,您可能希望插入有效行并抛出其余行,或者如果1行以上的行无效则抛弃所有行。您还可以制作逻辑来处理可能破坏完整性要求的更新或删除。
请注意,触发器会对性能产生负面影响,尤其是在频繁更改表时。
其他方法是按照建议在应用程序逻辑中处理此问题,和/或无论如何都允许数据进入表中,但定期验证现有数据。例如,夜间过程可以识别未满足此要求的数据并传递给人来纠正。