您的位置:首页 > 数据库

系统架构设计之--数据库主健选择篇

2008-08-03 00:00 471 查看
软件设计阶段,其中一个要考虑的问题就是数据库主健,不考虑不需要主健的情况,本文主要关注于主健设计选择。

1. Identity 作为主健。

存储大小:基本上都是int类型,需要占据4byte,考虑主健索引的情况下,每个主健基本上要占据8byte的存储空间。

优点:

1. 基本由数据库自动生成,不重复,无须手动维护。

2. 存储空间小,如果数据库设计合理,每页记录可以存储更多行记录,减少IO读写。

3. 性能好,不需要考虑并发,事务等相关影响性能的问题,系统自动处理。

缺点:

1. 字长只有32位,在Web下海量数据存储时,32位ID理论上存在不够用的情况。

2. 数据库集群情况下,或者在数据移植或合并过程中,多个记录可能存在主健重复的场景,后果很严重!

3. 如果数据操作是主从操作时,存在相互引用的关系,必须操作N次才可以保存成功(N > 1 ,不考虑存储过程情况下)

4. 由于是数据自动生成,会存在ID浪费的情况,比如批量引入1W条记录,则ID相应增大1W,当事务失败回滚时,此ID操作不会回滚,当前ID将变为ID+1W

2. GUID

有两种GUID,一种数据库生成,一种程序生成,GUID将占用16byte,考虑索引要占用32byte的空间

优点:

1. 两种生成方式,数据不重复,无须手动维护。

2. 数据合并移植过程中无须考虑主健ID重复因素 。

3. 主从操作程序中,可以程序一次性 生成相关GUID,提交程序性能

缺点:

1. GUID占用16byte,考虑索引等相关情况,严重浪费数据库存储空间。

2. 查询性能相对较慢,每次保存时候需要重新排序索引,索引性能也有所下降。

3. 使用RAID存储时, 在性能上还有一个区别因素. GUID方案的读写磁头和区域是接近随机分配的, 而identity方案则是集中在一个区块的。

3. 数据库MaxID算法

存储字节可4-8个字节,自己定义,自由。可针对每个业务对象(表)都有一个最后MaxID,此算法可以看成是Identity 变种。

优点:

1. 手工控制ID生成,存储空间,索引大小自己控制

2. 事先可以考虑数据合并ID重复问题,如数据库最高一位作为对象区分,如库1最高位1,数据库2最高位2 ,以次类推,数据合并无须考虑数据重复问题

缺点:

1. 不管是主从表存储,还是单表存储,都需要先去数据取一次ID,性能差。

2. 获取MaxID时候,如果未和保存操作放置到一个事务里,如果更新覆盖,如A产生的是100,B也会产生100,造成潜在数据错误。

3. 放置一个事务里处理不好,容易死锁。典型先查最大值MaxID,然后更新为MaxID + 1,并发中两个线程同时对MaxID加共享锁,最终升级更新锁失败,产生死锁。

4. 程序ID生成器算法

存储字节可4-16个字节,自己定义,自由。算法选择性多

优点同上:

3. 自己可以设计一个更高效的ID生成算法

缺点:

1. 如果将ID计算结果存储在内存,或者File中需要考虑程序的可靠性。

2. 程序生成过程中,必须考虑并发问题,加锁等相关处理方式

3. 最大值保存问题,如果保存在数据库将面临上述3的问题,如果保存在内存中或者file中,算法生成器失败后,如何重新开始最大号成为问题.考虑性能和其它相关问题,可以每隔生 成1000个ID更新一次数据库,有生成器统一处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐