关系数据库及主键设计(讲稿)
^^^^^^^^^^^^^^^^^^^^^^^^^^
- 作者:臭豆腐[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