支付表设计

Cra*_*aig 5 sql database-design

我有一个表,用于保存项目中的人员的数据.该表的Start日期字段为可以为空的End日期字段.所以,一个人从一个项目StartEnd.

目前,他们总是对项目收费.但是我现在有了一个新的要求,即在一段时间内,它们可以是不可计费的,但仍然在进行该项目.因此,他们已被分配到项目中并且正在工作,但由于某种原因,客户不会在分配期间的一部分时间收费,或者可能以较低的费率收费.

我的想法是有一个排除类型表,链接到具有开始日期和结束日期的人员分配表,以及一个Rate列,可以设置为零免费,或者作为覆盖值一段时间.

这看起来像是有效的设计吗?由于该人在95%的时间内被收费,并且可能永远不会被排除在外,因此我有一个排除表更有意义.

如果有人知道如何做得更好,那就太好了.

目前,我还有一个"日历"表,我根据人员日程安排的开始/结束日期加入,以获得每日费率.那么,我可以加入排除日期,看看是否有覆盖率?

我可能会在设计中发现的问题是很多连接基于:

 ON DateValue BETWEEN Start AND End
Run Code Online (Sandbox Code Playgroud)

而且我不确定它们是最有效的连接.

Edp*_*per 1

如果例外可能是一个项目的一个或多个时间段(一对多),那么使用排除表的设计是最佳设计。

例子:

June 1, 2013 to June 30, 2013
Run Code Online (Sandbox Code Playgroud)

排除:

June 9, 2013 - 0 Rate
June 25 to 27 - 30% of Original Rate
Run Code Online (Sandbox Code Playgroud)

但是,如果排除是可能的,并且最多只能是一个单一期间(或一对一类型的关系),那么您可以将其放在与项目表上其他字段相同的字段上。

例子:

June 1, 2013 to June 30, 2013
Run Code Online (Sandbox Code Playgroud)

排除:

June 9, 2013 - 0 Rate
Run Code Online (Sandbox Code Playgroud)