[20120319]使用sys_guid()做为主键的问题.txt

最近一段时间都在优化一个项目,发现其表的主键是通过sys_guid()生成的,这样的结果就是主键以及外键在表中占的比例很大。

SELECT count(*)  FROM dba_tab_columns WHERE wner = 'XXXX';


  COUNT(*)
----------
      1238
1 row selected.


SELECT count(*)  FROM dba_tab_columns WHERE wner = 'XXXX' AND data_type = 'VARCHAR2' AND data_length = 36;

  COUNT(*)
----------
       453
1 row selected.

--说明一下sys_guid() 生成的32位的,开发在中间插入'-'做为分隔,这样data_length=36。

我粗略估算了一下,仅仅是表,这些主键占用的空间大约40-50%。如果包括索引,可以到达60-65%。

我还仔细看了数据结构,发现这个项目主外键定义很严谨。 真无法想象这个项目以后会怎么样?讲句老实化,使用它最大的好处是简单,其它根本看不出任何优点。

我google,发现UUID的相关信息:
http://zh.wikipedia.org/zh/UUID
http://zh.wikipedia.org/zh-hans/UUID

通用唯一识别码 (Universally Unique Identifier, UUID) 是一个软件建构的标准,亦为*软件基金会 (Open Software Foundation, OSF) 的组织在分散式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。

UUID 的目的,是让分散式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过*控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑资料库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。另外我们也可以在 e2fsprogs 套件中的 UUID 函式库找到实作。

定义

一组 UUID,是由一串 16 位元组(亦称 16 字节,或 128 位元)的16进位数字所构成,是故UUID理论上的总数为216 x 8=2128,约等于3.4 x 1038。也就是说若每奈秒产生1兆个UUID,要花100亿年才会将所有UUID用完。

UUID的标准型式包含32个16进位数字,以连字号分为五段,形式为8-4-4-4-12的32个字元。范例;

    550e8400-e29b-41d4-a716-446655440000

UUID亦可刻意重复以表示同类。例如说微软的COM中,所有元件皆必须实作出IUnknown介面,方法是产生一个代表IUnknown的UUID。无论是程序试图存取元件中的IUnknown介面,或是实作IUnknown介面的元件,只要IUnknown一被使用,皆会被参考至同一个ID:00000000-0000-0000-C000-000000000046。

原来在linux中也有使用。
比如
# tune2fs -l /dev/sda2
tune2fs 1.35 (28-Feb-2004)
Filesystem volume name:   /
Last mounted on:         
Filesystem UUID:          550851f8-68ac-4fc3-a454-4359befb3dbc
Filesystem magic number:  0xEF53


也可以使用uuidgen命令生成uuid(在e2fsprogs软件包中):
# uuidgen
ddbb2ded-bdeb-4b6d-b6f5-8aa304e15eb6

上一篇:非常规数组转换问题


下一篇:递归练习:猴子吃桃问题