SQL模型/模式设计、检查约束、FK或表重新设计?

SQL模型/模式设计、检查约束、FK或表重新设计?,sql,database-design,entity-relationship,database-schema,Sql,Database Design,Entity Relationship,Database Schema,我有以下模型(简化了所有其他字段,重点是主键ID): 一家公司包含许多客户,而这些客户又可以拥有许多属于该客户的发票 虽然上面没有显示,但我也希望有一个属于一家公司(并且只有一家公司)的战略列表 我希望客户、发票和公司能够定义一个“默认策略”,该策略引用他们所属公司的策略 我知道我可以在每个表(发票、客户和公司)中添加一个名为strategy_id的额外FK字段,但我如何确保如果进行了更改(有人试图将策略移动到另一家公司),我们不会得到发票,或客户指向另一家公司的策略列表中的策略 我将如何处理这

我有以下模型(简化了所有其他字段,重点是主键ID):

一家公司包含许多客户,而这些客户又可以拥有许多属于该客户的发票

虽然上面没有显示,但我也希望有一个属于一家公司(并且只有一家公司)的战略列表

我希望客户、发票和公司能够定义一个“默认策略”,该策略引用他们所属公司的策略

我知道我可以在每个表(发票、客户和公司)中添加一个名为strategy_id的额外FK字段,但我如何确保如果进行了更改(有人试图将策略移动到另一家公司),我们不会得到发票,或客户指向另一家公司的策略列表中的策略

我将如何处理这个问题?我是否需要在业务逻辑中检查所有这些,或者使用检查约束,或者这可以通过重新设计表和外键来实现

多谢各位


克里斯

如果公司改变战略,你介意属于公司的客户或发票改变他们的战略吗

例如:如果公司1有战略1。它有customer1、customer2(有发票1)。那么,如果公司1将其发票更改为策略2,那么customer1、customer2和invoice1是否属于策略2或策略1就可以了

如果没有关系,请执行以下操作:

  • 向公司表添加约束。要检查客户/发票的策略,请找到母公司并检查其策略
否则,如果有关系:

  • 将约束添加到公司表中,如果有子客户/发票属于公司,则不允许更改该约束(检查是否存在)
  • 像上面提到的那样为每个表设置一个约束

  • 如果你想要一个更具体的答案,你必须澄清。

    如果我理解正确,你希望每个公司都有许多战略,每个战略都属于一个公司(因此公司和战略之间存在
    1:n
    关系)。每个公司都有一个默认策略,这也是所有客户及其发票的默认策略

    您可以通过添加一个与
    [strategy]
    表处于
    1:1
    关系的表
    [company\u default\u strategy]
    将这些约束定义为外键约束(一些策略是默认的):


    谢谢你的快速回复。是的,重要的是,如果有人试图在战略使用期间将战略更改为另一家公司,则这是不允许的。如果您有任何关于SQL约束条件/代码的链接来实现上述目标,那将是非常好的,通常我只在业务逻辑级别进行了此检查,但最近我开始担心保护应用程序不受奇怪状态的影响,这些奇怪状态在数据库中“有效”,但在实体模型中无效。您已经用上述内容回答了我的问题,谢谢。很高兴我能提供帮助。如果您还有任何问题。:)最后一个澄清/问题是,在业务逻辑层也检查这些约束(我使用的是EntityFramework和SQL后端),还是让数据库来处理?我希望避免在许多不同的地方重复工作和实现规则。我一直在检查存储过程中的约束。唯一的问题是,您可以通过几个过程复制它。我认为这取决于有多少人在项目中工作以及您自己的选择。好的,伟大的Kyra,因为我使用的是EntityFramework,所以实际的底层数据库没有定义,而且EF不支持检查约束,所以进行这些检查的逻辑位置在业务逻辑层。谢谢你的帮助,你真的帮了我。回答得很充分。
    [invoice]
     invoice_id
     customer_id
     invoice_description
    
    [customer]
      customer_id
      company_id
      customer_name
    
    [company]
     company_id
     company_name
    
    [strategy]
     strategy_id
     strategy_descripton
    
    [invoice]
     invoice_id     PK
     customer_id    FK  to  customer(customer_id)
     invoice_description
    
    [customer]
     customer_id    PK
     company_id     FK  to  company(company_id)
     customer_name
    
    [company]
     company_id     PK
     company_name
    
    [strategy]
     strategy_id    PK
     company_id     FK  to  company(company_id)
     strategy_descripton
    
    [company_default_strategy]
     company_id     PK, FK1 
     strategy_id    FK1
       FK1 (strategy_id, company_id)  to  strategy(strategy_id, company_id)