层次型枚举

层次型枚举

我们在定义枚举时常常有这样子的需求,即值也希望可以像类一样继承。什么意思呢,我们举个例子吧。

我们对 PC 进行管理时,通常会有一个字段叫 OSType 来表示 PC 上的 OS 的类型,于是我们可能会定义下面形式的枚举值:

RedHat
CentOS
Ubuntu
AIX
HPUNIX
WindowXP
Window2000
Window2003
WindowVista
Window7
Window2008

 

而在你可能这样统计 PC, 安装 window 的有多少,安装 linux 的有多少,安装 Unix 的有多少,这时它可能会这样子改正 ,并要求以字符串来保存 .

Linux_RedHat
Linux_CentOS
Linux_Ubuntu
Unix_AIX
Unix_HPUNIX
Window_XP
Window_2000
Window_2003
Window_Vista
Window_7
Window_2008

但这样子仍然是不行的 , 我可以想要统计安装 Window 系统且版本在 2003 以上的 PC, 呵呵, I 不行了吧。

不知道大家了不了解一种树在 RDBMS 中的存储方式,即 Nested set model ,它是一种 RDBMS 中存储树结构的前序遍历树模型的改进,(呵呵,你在 Google 上以“改进的前序遍历树模型”为关键字可以得到你想要的中文信息,他们都不注明来源,所以我也不想引用他们了)。

我们可以将它用到枚举上了,如上面的枚举转化为下面的形式

OSType
   +--Linux (1, 4)
   |    +-- RedHat (2, 2)
   |    +-- CentOS (3, 3)
   |    +-- Ubuntu (4, 4)
   +--Unix (5, 11)
   |    +-- AIX (6, 6)
   |    +-- HPUNIX (7, 7)
   |    +-- Solaris (8, 8)
   |    +-- BSD (9,11)
   |          +-- FreeBSD (10, 10)
   |          +-- NetBSD (11, 11)
   +-- Window (12, 18)
   |    +-- Win2000 (13, 13)
   |    +-- Win2003 (14, 14)
   |    +-- WinXP (15, 15)
   |    +-- WinVista (16, 16)
   |    +-- Win7 (17, 17)
   |    +-- Win2008 (18, 18)
 
 Nested set model 一样,但不用像它那样有三个值,因为它自身的 Id 就是最小值,因此只要两个就可以了,将一个枚举项转化为三个值:自身的枚举 ID ,子节点中的最大 ID 。当你将枚举值存储到 OSType 时保存自身的枚举 ID 

安装 window 的有多少  select * from x where OSType >= 12 and OSType <= 18
安装 linux 的有多少 select * from x where OSType >=1 and OSType <= 4
安装 Unix 的有多少 select * from x where OSType >=5 and OSType <= 11
安装 BSD 的有多少 select * from x where OSType >=9 and OSType <= 11
安装 Window 系统且版本在 2003 以上有多少 select * from x where OSType > 14 and OSType <= 18

呵呵 , 这个的比上面的那个灵活多了吧 , 而且比上面那个方案效率也高很多 .


posted on 2010-09-14 18:55  runner.mei  阅读(772)  评论(2编辑  收藏  举报

导航