继承的业务规则的数据库设计

时间:2011-10-26 16:48:48

标签: c# sql-server entity-framework database-design

想象一下,一家大公司在世界各地都有很多代表团。您将设计一个系统,每个办公室的员工每天将其额外工作时间提交到系统中。

我们有这些表格:

  ----------         --------          -------        --------       ----------     
 |Countries| 1---> * |States| 1--->*  |Cities|1 --->* |Offices|1--->*|Employees|
  ---------          --------         --------       ---------       -----------

经理将能够确定每个级别(大陆,国家,......)的最大额外工作时间(业务规则)。

规则将从父级继承到子级。和孩子可以覆盖

例如,如果经理确定Country1最大额外工作时间为4,那么Country1的所有员工的最大有效额外工作时间将为4,如果经理确定StateXX中的CityXX且该州位于Country1 Max将为3,那么该城市的所有员工(CityXX)的有效额外工作时间将为3。

我希望能够解决这个问题。我的问题是你如何实现这样的系统哪些规则将被继承?

Edit :

谢谢大家。我创建了这些表,因为它们是不同的实体。它们中的每一个都具有不同的属性和行为。这只是一个想象的情况。我的真正需求需要更多级别和更多实体和业务规则。

5 个答案:

答案 0 :(得分:1)

一种选择是仅将其存储在一个级别,以便它根本不“继承”。
这真的是城市或办公室层面或员工层面的可继承财产吗?地方立法(例如欧盟工作时间指令)决定它,而不是经理。

另一种方法是对其进行非规范化。

  • 每个孩子都有两列:maximumextraworkhour和IsLocalOvertimeRule(位)
  • 通过孩子IsLocalOvertimeRule = 0
  • 的触发器向父下推的更改

答案 1 :(得分:1)

在GBN的解决方案的基础上,一个级别将是最佳的。您描述的层次结构可以是默认优先级,状态是10,城市是20,依此类推。如果需要,用户可以覆盖,或者如果层次关系是静态的,则可以将其编码为元数据表(RulePrecedence)。

以下是一个示例查询:

Select * from Rule Where [What Rule Is Needed] Order by Precedence

然后,您可以根据需要为每个规则设置多个评估/级别,并按优先级顺序对它们进行评估。

我认为这样可行,架构也不会那么复杂。

如果没有那么多评估,那么查询可以很简单。如果可能有成千上万的“覆盖”,那么你可能想要这样的东西来限制返回的“规则”:

Select * from Rule Where Rule.Country = 'US' AND Rule.State = 'MA' And Rule.ID = 'MaxExtraWorkHour' Order By Precedence

请注意,这些查询仅供参考。 (选择*仅用于保存输入)

答案 2 :(得分:1)

您可以使用基于物化路径的方法。我在这里写了一个罐头答案:Store your configuration settings as a hierarchy in a database

答案 3 :(得分:0)

我最初的想法是让一个字段在每个级别保留最多额外工作时间,然后允许每个级别的相应人员设置该字段。然后,在你的表joinery中,你将连接所有表,然后使用COALECSE获取第一个非空的字段,从最具体的字体开始,然后向普通字体移动。

类似的东西:

SELECT
   COALECSE(o.MaxExtraHours, t.MaxExtraHours, s.MaxExtraHours, c.MaxExtraHours, 4) as MaxExtraWorkHours
FROM
   Countries c
INNER JOIN
   States s on c.ID = s.CountryID
INNER JOIN
   Cities t on s.ID = t.StateID
INNER JOIN
   Offices o on t.ID = o.CityID

“4”是默认值,但您可以将其保留为null,或者也可以在每个级别存储默认值,然后在尝试特定字段后开始向下走默认值。

答案 4 :(得分:0)

朴素是生活的美丽,我同意 gbn 您可以将MaxExtraHours存储在办公室桌面,这样您就不需要了 打扰你自己写一个复杂的查询。如果你坚持不改变结构,你的查询将起作用 as coalesce返回其参数中的第一个非null表达式。