想象一下,一家大公司在世界各地都有很多代表团。您将设计一个系统,每个办公室的员工每天将其额外工作时间提交到系统中。
我们有这些表格:
---------- -------- ------- -------- ----------
|Countries| 1---> * |States| 1--->* |Cities|1 --->* |Offices|1--->*|Employees|
--------- -------- -------- --------- -----------
经理将能够确定每个级别(大陆,国家,......)的最大额外工作时间(业务规则)。
规则将从父级继承到子级。和孩子可以覆盖
例如,如果经理确定Country1最大额外工作时间为4,那么Country1的所有员工的最大有效额外工作时间将为4,如果经理确定StateXX中的CityXX且该州位于Country1 Max将为3,那么该城市的所有员工(CityXX)的有效额外工作时间将为3。
我希望能够解决这个问题。我的问题是你如何实现这样的系统哪些规则将被继承?
Edit :
谢谢大家。我创建了这些表,因为它们是不同的实体。它们中的每一个都具有不同的属性和行为。这只是一个想象的情况。我的真正需求需要更多级别和更多实体和业务规则。
答案 0 :(得分:1)
一种选择是仅将其存储在一个级别,以便它根本不“继承”。
这真的是城市或办公室层面或员工层面的可继承财产吗?地方立法(例如欧盟工作时间指令)决定它,而不是经理。
另一种方法是对其进行非规范化。
答案 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表达式。