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