需要帮助在多个表之间创建主键/外键关系

时间:2015-09-15 20:59:03

标签: sql-server database entity-framework tsql

背景

(我正在使用Microsoft SQL Server 2014)

我的公司收到包含许多帐户(tblFile)的数据文件(tblAccount)。对于每个数据文件,我们可能会执行多个“pricings”(tblPricing),这些“pricings”可能包含文件中的所有帐户,或者只包含其中的一部分,但“pricings”不能包含任何帐户不在定价所依据的文件中。所以,总结一下:

  1. 我们收到一个文件
  2. 此文件可包含多个帐户
  3. 我们从这个单一文件中创建了许多价值
  4. 每个定价都可以包含其链接到的文件中的全部或部分帐户,但不包含该文件中的帐户
  5. 这是今天存在的(方式)简化数据库图表: Simplified Database Diagram

    问题:

    到目前为止有效:

    • tblFiletblPricing
    • 之间的1:多种关系
    • 许多:tblFiletblAccount之间的多种关系(一个帐户可以存在于多个文件中)
    • 许多:tblPricingtblAccount之间的许多关系(因为可以执行许多定价,许多定价中都存在一个帐户)

    我们的问题来自于尝试在文件所具有的帐户子集与定价所具有的帐户子集之间实施完整性。使用上述结构,tblPricingAccounts可以包含tblFileAccounts中未包含的帐户,违反了我们对每个定价的需要,以便仅包含其所基于的文件中的帐户。

    我尝试更改外键关系,我打破了tblPricingAccountstblAccount之间的链接,从tblPricingAccounts删除了'acct_id',而是将tblPricingAccounts链接到tblFileAccounts(是的,我知道我需要tblFileAccounts中的主键,我有一个主键。但是,然后我能够在tblPricingAccounts中插入我想要的任何'pricing_id'。现在,我可以将帐户链接到与最初包含这些帐户的文件无关的定价。

    需要

    在一天结束时,我不关心我的数据库的结构或关系是什么样的。我只需要满足以下条件,而我似乎无法理解它:

    1. 一个文件包含许多帐户。
    2. 一个文件包含许多价格。
    3. 定价包含许多帐户,但这些帐户必须包含在与定价相关联的文件中。
    4. 感谢任何帮助,我对所有可以在SQL Server中执行的建议持开放态度。最终我正在围绕这个数据库构建一个Web应用程序,我正在使用Entity Framework 6来简化生活(主要是......)。我显然可以通过我的代码强制执行上述3个需求,但我真的希望数据库成为强制执行此完整性的最后一道防线。

2 个答案:

答案 0 :(得分:1)

听起来tblFileAccounts可能是多余的。尝试完全删除它,并通过tblPricingAccounts和tblPricing中捕获的关系推断哪些文件存在于哪些文件中。

如果这符合您的需要,并且没有合法属于tblFileAccounts对象(表)的属性(列),那么我认为您的问题已经解决。

答案 1 :(得分:1)

这是外键约束无意处理的情况。 FK约束测试表之间是否存在值;他们没有强制执行特定的基数要求。

简单的基数是"一对多","多对多"问题中提到的关系。您更复杂的需求仍然主要是关于基数:它要求某些行的子集以特定方式与某些行的其他子集相关。 "窗口基数"如果你愿意的话。 (就我所知,我自己的造币。)

正如对问题的评论中所建议的,在数据​​库中完全强制执行此操作的一种方法是通过触发器。在这种情况下,精心设计的触发器可能会测试要插入的新行是否有效,如果没有插入则不会插入错误。对于批量插入,您可能希望插入有效行并抛出其余行,或者如果1行以上的行无效则抛弃所有行。您还可以制作逻辑来处理可能破坏完整性要求的更新或删除。

请注意,触发器会对性能产生负面影响,尤其是在频繁更改表时。

其他方法是按照建议在应用程序逻辑中处理此问题,和/或无论如何都允许数据进入表中,但定期验证现有数据。例如,夜间过程可以识别未满足此要求的数据并传递给人来纠正。