Sql server 需要帮助在多个表之间创建主键/外键关系吗 背景:

Sql server 需要帮助在多个表之间创建主键/外键关系吗 背景:,sql-server,database,entity-framework,tsql,Sql Server,Database,Entity Framework,Tsql,(我正在使用Microsoft SQL Server 2014) 我的公司接收包含许多帐户(tblAccount)的数据文件(tblFile)。对于每个数据文件,我们可以执行多个“定价”(tblPricing),这些“定价”可能包含文件中的所有账户,或仅包含其中的一个子集,但“定价”不能包含任何不在定价依据文件中的账户。因此,总而言之: 我们只有一个文件 此文件可以包含多个帐户 我们从这个文件创建了许多pricing 每个定价都可以包含其链接到的文件中的全部或部分帐户,但该文件中没有不包含的帐户

(我正在使用Microsoft SQL Server 2014)

我的公司接收包含许多帐户(
tblAccount
)的数据文件(
tblFile
)。对于每个数据文件,我们可以执行多个“定价”(
tblPricing
),这些“定价”可能包含文件中的所有账户,或仅包含其中的一个子集,但“定价”不能包含任何不在定价依据文件中的账户。因此,总而言之:

  • 我们只有一个文件
  • 此文件可以包含多个帐户
  • 我们从这个文件创建了许多pricing
  • 每个定价都可以包含其链接到的文件中的全部或部分帐户,但该文件中没有不包含的帐户
  • 下面是一个简化的数据库关系图,它现在已经存在:

    问题: 到目前为止,什么在起作用:

    • tblFile
      tblPricing
    • tblFile
      tblAccount
      之间的多:多关系(一个帐户可以存在于多个文件中)
    • tblPricing
      tblAccount
      之间的多:多关系(因为可以执行多个定价,一个账户可以存在于多个定价中)
    我们的问题来自于试图在文件所拥有的帐户子集和定价所拥有的帐户子集之间强制执行完整性。使用上述结构,
    tblPricingAccounts
    可以包含
    tblFileAccounts
    中未包含的账户,违反了我们对每个定价仅包含其所基于的文件中的账户的要求

    我尝试更改外键关系,在这里我断开了
    tblPricingAccounts
    tblAccount
    之间的链接,从
    tblPricingAccounts
    中删除了“acct\u id”,而是将
    tblPricingAccounts
    链接到
    tblFileAccounts
    (是的,我知道我需要
    tblFileAccounts
    中的主键,我有一个)。但是,然后我可以在
    tblPricingAccounts
    中插入我想要的任何“定价id”。现在我可以将帐户链接到与最初包含这些帐户的文件无关的定价

    需要 归根结底,我不在乎数据库的结构或关系是什么样的。我只需要满足以下标准,我似乎无法集中精力:

  • 一个文件包含许多帐户
  • 一个文件包含许多pricing
  • 定价包含许多帐户,但这些帐户必须包含在定价链接到的文件中

  • 非常感谢您提供的任何帮助,我愿意接受SQL Server中可以执行的所有建议。最终,我将围绕该数据库构建一个web应用程序,并使用Entity Framework 6简化工作(主要是…)。显然,我可以通过我的代码强制执行上述3个需求,但我真的希望数据库成为强制执行此完整性的最后一道防线。

    听起来好像
    tblFileAccounts
    可能是多余的。请尝试将其全部删除,并通过t中捕获的关系推断哪些帐户存在于哪些文件中blPricingAccounts和tblPricing


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

    这是一种外键约束不打算处理的情况。FK约束测试表之间是否存在值;它们不强制执行特定的基数要求

    简单的基数是问题中提到的“一对多”、“多对多”关系。不过,你更复杂的需求基本上还是关于基数的:要求某些行子集以特定的方式与某些其他行子集相关联。“窗口基数”(如果你愿意的话)(据我所知,这是我自己创造的)

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

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


    其他方法是按照建议在应用程序逻辑中处理此问题,和/或允许数据进入表,但定期验证现有数据。例如,夜间流程可能会识别不符合此要求的数据,并将其传递给人员进行更正。

    不幸的是,它无法满足我们的需要,因为可能永远不存在定价,我们仍然需要确定哪些帐户属于哪个文件。一个文件中的两个定价是否都包括同一个帐户(该文件中的帐户)?是的。我们的业务理念是,我们接收包含帐户的文件。然后我们对这些文件进行定价,对IRR、最高价格等某些内容进行目标搜索。因此,我们可以对单个文件执行5个定价,并且5个定价中的每一个都可能有来自该文件的唯一帐户子集。然后……我们可以将一个新文件作为“更新”输入这可能有第一个文件没有的额外帐户。然后我们会重复定价练习。我的新答案有点取代了这一个,现在我考虑了更多。你有没有考虑过使用
    tblPricingAccounts
    上的触发器通过
    tblFileAccounts
    查找
    帐户id
    并匹配
    文件_id
    tblPricing
    中?嗯,不。我被授予设计权