设计只能拥有2个外键中的一个的数据库实体?

Lou*_*hys 5 .net database nhibernate database-design hibernate

我们系统中的一个进程负责根据某些规则发送文件.根据文件名,可以将文件发送给客户或工厂(但不能同时发送).

规则的每一行都将包含文件名过滤器,它所属的客户和工厂,并指定其他参数,例如目标文件夹,文件是否需要加密,拆分,组合,重命名等.

在此过程中,我们将了解文件所属的工厂和客户,我们将查看工厂和客户的规则,并应用与过滤器匹配的文件规则(将优先考虑客户规则)

表示规则与数据库中客户/工厂之间关系的最佳方式是什么?我们已经在数据库中有Customer和Factory表,但我想不出表示关系的最佳方式.每条规则都只有一个FK(客户或工厂,它不能同时拥有两个,也不能没有).表示这一点的方法之一是:

在此输入图像描述

但这并不能说明它只能拥有两个FK中的一个.我们可以设置一个约束,其中一个需要有效FK而另一个必须是空的,但它似乎不是很干净.此外,如果我们有其他规则的决定因素(例如国家),它将变得更加丑陋.知道如何改进这种设计吗?

我认为这也有助于指定系统是用.NET开发的,我们使用对象关系映射,即NHibernate.

Car*_*rra 6

看一下表继承.

你可以使用这样的东西:

Rule
  int RuleId
  int TypeRule
  PK (RuleId)
  UQ (RuleId, TypeRule)

CustomerRule
  int TypeRule = 1
  int CustomerId
  FK (TypeRule, RuleId)
  FK CustomerId

FactoryRule
  int TypeRule = 2
  int FactoryId
  FK (TypeRule, RuleId)
  FK FactoryId
Run Code Online (Sandbox Code Playgroud)

使用这样的系统,您可以拥有客户规则或工厂规则,而不是两者.此外,明天添加CountryRule很容易.