SQL_PUZZLE_1:财务年度表(Fiscal Year Table)
时间:2011-01-03 来源:Bright Zhang
1)财务年度表,其作用就是将唯一的时间段与一个唯一的ID相关联的一个表,通过这个表,只要提供一个日期就能够准确的定位到一个fiscalYearId(PK)。
2)该表由于是针对时间段的唯一性,因此不能够使用传统的唯一性约束,只能够使用check来辅助使用。在check中可以限制一个财务年度的天数,可以限制开始日期和结束日期的计算规则,例如2011年度,从2011-1-1到2011-12-31,或者是2010-12-1到2011-11-30日。还可以限制开始日期和结束日期的大小关系。
以前在处理这种时间段唯一性的时候,大多在数据库约束层面做的工作非常少,这样就不可避免的增加了脏数据生存的可能性。
这是sql server下的例子:
create table fiscalyeartable(
fiscal_year integer not null primary key,
start_date date not null,
constraint valid_start_date
check ((year(start_date) = fiscal_year - 1)
and (month(start_date) = 10)
and (day(start_date) = 01)),
end_date date not null,
constraint valid_end_date
check ((year(end_date) = fiscal_year)
and (month(end_date) = 09)
and (day(end_date) = 30)));
记得之前有做过ICCID段的管理,这种号码段的管理,也要求号码段的唯一性,只是这种号码段非常复杂,而且由于号码长达20位,因此数据库内建的处理函数已经无能为力,bigint只能处理17位的数字,这样就要求建立用户函数来处理,而在数据库约束层面使用用户函数,这种依赖是不好的做法,除非万不得以。
而对于有些数据结构非常复杂的情况,例如在数据存在层次结构的情况,这就增加了数据库层约束的难度,甚至是没办法实现,例如我在上面提到的ICCID段的管理就是一例,这样就只能在关系数据库层提供粗略的约束,然后在业务层中,在对该表操作的时候提供更进一步的数据检查。