层次型枚举
层次型枚举
我们在定义枚举时常常有这样子的需求,即值也希望可以像类一样继承。什么意思呢,我们举个例子吧。
我们对 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) 编辑 收藏 举报