论如何设计关系数据库结构
————简稿(欢迎联系沟通)
起草人:林宣武
起草时间:2005-5-1
联系方式:linxuanwu9@yahoo.com.cn
主要设计表结构时必须要注意的地方:
一.主要的要求:
表结构主要是为了给存储表内容(insert,update,del),查询表内容(select)
1. 存储表内容:
当需要大批量的更新数据库时:
(1. 减少更新表的中的索引关系内容
(2. 让每次更新的数据量要尽量的少,同时要考虑到更新效率要高,最好做完整的测试
(3. 更新多个表时,最好写到存储过程中
2. 查询表内容:
当需要从大量的数据中查询数据库表内容时:
(1. 减少一次性从数据库中查询的数据量(sql + ddl)
(2. 减少大范围搜索表中的数据内容(sql 中尽量的减少表间的关联)
(3. 对常查询的字段,适量的增加索引关系
二.表结构设计时要考虑的内容
表结构包括了独立的表,表间关系,表字段(字段名 + 字段类型) ,表字段关系.
1. 设计原则
(1. 减少冗余—表内每个值在整个数据库中只表达一次 : 提高更新效率
(2. 方便查询—表内每行都应能被唯一标识(有主键) : 提高查询效率
(3. 减少关联—表内不应存储依赖其他的键的非主键信息 : 提高查询效率
(4. 关系独立—专表存放表间键的关联关系: 提高更新效率
(5. 考虑未来—(灵活性,可维护性)考虑现在客户对系统的需求同时分析可能变更的需求,并设计
(6. 特殊处理
—适当冗余: 大量过频数据表间关系查询时,提高表内冗余及关系不独立(前提可以提高查询效率)
(7. 范式:表结构标准化设计,不过一般实际设计时没有必要完全实现3NF
1NF: 没有重复的字段或字段组
2NF: 每个非关键字段函数相关于主键
3NF: 没有非关键字字段函数相关于任何其他非关键字字段
2. 关系数据库表设计方法
(1. 从需求中提了主要存储实体及关系构造ER图
(2. 根据ER图建立表结构
1).为每个实体类型建立一张表
2).为每个表选择一个主键
3).增加外键表示实体间一对多的关系
4).增加新表来表示实体间多对多的关系(若多对一的关系有可能转化为多对多关系,就用新增表)
5).定义外键间参照完整性约束(维护外键)
l 建立一个包括外键的记录时,确保它在另一个相关表中以主键形式出现
l 删除一个记录时,确保相关表中没有外键与被删除记录的主键有相同值
l 改变一个主键值时,要求相关表中没有外键与它有相同值
避免使用复合键。 外键总是关联唯一的键字段。
(3. 优化表结构
l 表中每一行及主键都是唯一的
l 冗余数据较少
l 容易实现未来数据模型的改变
l 大批量更新是否及时
l 主要查询是否快
3. 注意事项
(1. 避免直接删除数据,
可以增加一个注销标志,或者删除标志并用专门程序清理且要仔细维护索引整体性
(2. 避免使用触发器
触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如确实需要采用触发器,最好集中对它文档化。
(3. 仔细选择数字类型
正确估计字段的最大长度,过短就会影响系统正常运行,过长会影响数据库查询及更新
(4. 提防大小写混用的对象名和特殊字符
Access 到Oracle 数据库都存在,采用全部大写而且包含下划符的名字具有更好的可读性(CUSTOMER_DATA),绝对不要在对象名的字符之间留空格。
(5. 索引表时注意
不要为小型数据表设置任何键,假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。
要索引外键,不要索引大容量字段(会引起空间不足)
(6. 不用用户可修改的字段为主键
(7.
三.表结构设计中的命名规则
表名
为了很好的表示表结构中的内容,所以一般尽量的采用英文名称,尽量是全称,
前缀,后缀,及用 ”_” 相连,同时要保持一定的长度
1. 前缀—对应的表结构类型(默认空时为表)
索引—idx
包—pkg
存储过程—st
一般表的前缀为: 系统简称
2. 后缀—对应的数据类型
数据内容—data 不断增加的数据(大批量)
定义内容—define 基本不变或很少变化的数据内容
关系内容—relation 定义内容之间关系
历史记录—history 对必须记录下数据变更的内容记录(涉及到还原,查询)
备份内容—bak 拷贝,只用于还原
日志内容—log 记录主要操作事件及影响内容
3. 中间
尽量是全英文单词—名词,如果能统一的缩写时, 尽量统一
用 ”_” 相连
4. 整个名称,要保持一定的长度
字段名:
尽量根给于的数据类型保持一致
统一的前缀,编写SQL 表达式时会大大简化。这样做也确实有缺点,比如破坏了自动表连接工具的作用,后者把公共列名同某些数据库联系起来,不过就连这些工具有时不也连接错误嘛。举个简单的例子,假设有两个表:Customer 和Order。Customer 表的前缀是cu_,所以该表内的子段名如下:cu_name_id、cu_surname、cu_initials 和cu_address 等。Order 表的前缀是or_,所以子段名是:or_order_id、or_cust_name_id、or_quantity 和or_description 等