关系数据库及主键设计(讲稿)
^^^^^^^^^^^^^^^^^^^^^^^^^^
 - 作者:臭豆腐[trydofor.com]
 - 日期:2010-12-20
 - 授权:署名-非商业-保持一致 1.0 协议
 - 声明:拷贝、分发、呈现和表演本作品,请保留以上全部信息。

0. 文档目录
^^^^^^^^^^^
[[<=$INDEX]]

1. RDBMS的应用特点
^^^^^^^^^^^^^^^^^^
  * 理论基础是关系代数。如JOIN。
  * 模型有数据,关系和数据约束。
  * 设计范式起码要满足1/2/3NF,BCNF。
  * 事务特性符合ACID。
  * 分布式领域的CAP理论的CP。
  * OLTP和OLAP的不同应用。
  * NoSQL作为RDBMS的补充。

2. 设计范式
^^^^^^^^^^^
  * 1NF: 每列都是原子的。不多不重。
  * 2NF: 非主键完全依赖于主键。
  * 3NF: 非主键不传递依赖于主键。
  * BCNF:主或非主键不传递依赖于主键。

如果不满足范式的影响有:
  * 数据冗余
  * 插入、删除异常
  * 修改复杂

3. 事务特性
^^^^^^^^^^^
ACID(高一致,高可靠)
  * 原子性(Atomicity)全成败,无残留。
  * 一致性(Consistency)数据约束一致。
  * 隔离性(Isolation)事务彼此不影响。
  * 持久性(Durability)完成不可回退。

CAP理论(分布式领域)
  * Consistency(一致性), 数据变动都是同步的。
  * Availability(可用性), 好的响应性能。
  * Partition tolerance(分区容错性) 可靠性。

BASE(基本可用,牺牲一致性)
  * Basically Available 基本可用。
  * Soft state软状态,可以不同步,异步。
  * Eventually consistent最终一致,不是时时一致。

4. OLTP和OLAP
^^^^^^^^^^^^^
==================== table:oltp-olap ====================
项目       OLTP                       OLAP
用户       操作人员,低层管理人员     决策人员,高级管理人员
功能       日常操作处理               分析决策
DB设计     面向应用                   面向主题
数据       最新、细节、二维、分立的   历史、聚集、多维、集成的
存取规模   读/写数(百)条记录        读上百万(亿)条记录
操作频度   非常频繁(以秒计)         稀松(以小时,周计)
工作单位   严格的事务                 复杂的查询
用户数     数百个-数千万个            数个-数百个
DB大小     100MB-GB                   100GB-TB
=========================================================

5. NoSQL的出现
^^^^^^^^^^^^^^
  * 理论基础:CAP和BASE
  * 一族DB,定义模糊。Not Only SQL
  * Wide Column Store / Column Families 
  * Document Store 
  * Key Value / Tuple Store 
  * Graph Databases 
  * Object Databases 
  * Grid Database Solutions 
  * XML Databases 

6. RDBMS主键的特点
^^^^^^^^^^^^^^^^^^
  * 唯一的标识一行记录。
    否则,操作数据困难。
  * 作为外键来表达数据间关系。
    否则,数据冗余或表述复杂。
  * 主键具有唯一索引。
  * 主键列不允许NULL
  * B(-+*)TREE不NULL,BITMAP能NULL

7. RDBMS主键的选择
^^^^^^^^^^^^^^^^^^
  * 是否该具有实在意义。
    实在意义变更 vs. 可读性和冗余。
  * 单主键与符合主键。
    万不得已才用符合主键。
  * 主键要易于索引。
    数字优于字符串。
  * 主键尽量短小,以免外键冗余。
    1G数据时,每多1byte就多1G磁盘空间。

8. RDBMS主键的策略
^^^^^^^^^^^^^^^^^^
  * 自增型
    分段自增
  * 业务号型
    身份证号,邮件账号。
  * X+1型
    MAX(X)+1,IDFACTORY
  * 散列型
    SHA1,GUID/UUID

9. RDBMS主键的推荐
^^^^^^^^^^^^^^^^^^
  * INTEGER (32bit=4byte)
  * LONG/BIGINT (64bit=8byte)
  * GUID/UUID (128bit=16byte)

10. GUID/UUID
^^^^^^^^^^^^^
UUID (128bit=16byte) RFC 4122
表示形式(8-4-4-4-12)
    char(36)='682ecf75-5df2-102e-8548-9a095ebb92a8'
    binary(16)=x'682ecf755df2102e85489a095ebb92a8‘
DB中的格式
    Oracle: RAW(16)
    DB2/Derby: CHAR(16) FOR BIT DATA
    HSQLDB/MySQL: BINARY(16)

11. 自定义ID,A9ID
^^^^^^^^^^^^^^^^^^
A9ID 64bit = 8byte ,like long/bigint

格式定义
0xFFFF000000000000 instance 2^16=65535
0x0000FFFFFFFFFFFF sequence 2^48=281474976710656

可用性估算
seconds/year=3600(s)*24(h)*365(d)=31536000
requests/second=100000
requests/year=31536*10^8
need(0xFFFF)=89 year
if instance == 0xFFF then need 1428 year