水如烟

                 顺其自然,水到渠成 LzmTW

文或代码皆是面向初学者.我是爱好者,也是初学者.那些"文章",只按自己理解写,我是不知术语名词的.所以只供参考,也仅供参考.

导航

行政区划数据数据库的设计(三)

Posted on 2006-09-19 17:44  水如烟(LzmTW)  阅读(878)  评论(0编辑  收藏  举报

Author:水如烟

 
 
我以前从来不说,只写代码,就算也有“系列”的,也全是代码的。基础差,脑袋中没几个专用术语,所以是“说”的话会误导读者,特别担心会误导初学者。所以一再强调“仅供参考”。别信我说的,但可以参考我的思维方法。
 
写这个“系列”,一是可以总结一下自己的数据库设计方面的“想法”,二是代码贴在自己的BLOG上当作备份,三呢从头到尾的写出来,给初学者了解一个解决方案的大概过程。
 
文字的排版方面我不大热心,以后找个时间熟悉一下吧。现在只是多用换行,尽量的使界面清晰一些。
 
 
转到“说”技术,真头疼了。我不能边从MSDN上找术语边说,只能用自己的“术语”了。
 
我只说自己的做法,不跟别的方法进行对比,对比方法优劣不是我的能力所及。我甚至不知道如何有效使用索引。
 
整个数据库的设计核心是引入了“稳定数据日期”概念。所有的函数包括存储过程都围绕这个“稳定数据日期”进行操作。
如果不了解这个概念,就不容易读懂这个数据库设计。或许专业设计上已有这种模式,但是我不知道,所以下面还是说自己的。
 
一项数据,在一定的时间内它的属性值(有意义的字段值)如果相对的稳定,并且要反映不同时期它的属性值,就可以引入这个概念。
除了这里的区划码数据适合这种情形,日常中还有职员的岗位变动、考核的参照标准等等,在法津上约定的还有职员的年龄退休年限、工龄退休年限、个税基数等等。适用范围很广。
 
针对这种数据的“稳定数据日期”,定义为8位的nvarchar,通常的日期转换为八位数字串,如“2006-9-19”转换为“20060919”。它具有一个默认值,“Current”。
“Currnet”总影射到最近的时间,比如我现在要查2008年8月8日的数据,虽然实际时间还没到,它还是一样的起作用,指向了2008年8月8日的数据。
 
凡使用这个概念的表,它都有两个字段,如图中所示的“截止日期”和“起始日期”,这两个字段的类型都是“稳定数据日期”类型。这种表至少有一个约束,指定“截止日期”不小于“起始日期”。
“起始日期”表示这项数据自这个日期起生效;“截止日期”表示这项数据生效的最后日期。如果“截止日期”值是“Current”,那么它适用到现在,并且随时间推移一直生效下去。
 
这种数据具有时间顺序的强制性。如果表中记录已存在起始日期为20060101的数据,再插入或修改2005年的数据,那是不充许的,也不会成功。
 
这种表由“截止日期”和数据的特定外键组成主键,保证某一时间内(日期范围)它的记录项是唯一的。
 
当某一数据变动了,如果表中有相应的特定记录,它将相应记录载止日期为“Current”的记录进行修改,把载止日期的值改为最新数据的起始日期的前一天;表中存在还是不存在相应记录,最后都插入一条新记录,新记录的截止日期值为默认值,也就是“Current”。
 
当某一属性在某一时间之后停止使用了,将相应记录载止日期的“Current”值修改为截止有效日期。那样,查询该日期之后日期的数据中,不会再有反映这个属性的数据。其实质是取消了该记录的“Current”影射。
 
在这里,区划码的数据最旧的起始日期为20020331,所以只能查自2002年3月31日起的数据,再前的查不到了。所以初始化数据库时,应考虑把它延后至某一个日期,比如19491001,不过那时香港还不是特别行政区哪。
 
 
这篇介绍了数据库设计的核心,是引入了“稳定数据日期”概念。