大型ERP等数据库系统常见几种设计------(转)
1. 自增长 primary key
采用自增长 primary key主要是性能。早期的数据库系统,经常采用某种编号,比如身份证号码,公司编号等等作为数据库表的 primary key。然而,很快,大家就发现其中的不利之处。
比如早期的医院管理系统,用身份证号码作为病人表的 primary key。然而,第一,不是每个人都有身份证;第二,对于国外来的病人,不同国家的病人的证件号码并不见得没有重复。因此,用身份证号码作为病人表的 primary key是一个非常糟糕的设计。考虑到没有医生或者护士会刻意去记这些号码,使用自增长 primary key是更好的设计。
公司编号采用某种特定的编码方法,这也是早期的数据库系统常见的做法。它的缺点也显而易见:很容易出现像千年虫的软件问题,因为当初设计数据库表的时候设计的位数太短,导致系统使用几年后不能满足要求,只有修改程序才能继续使用。问题在于,任何人设计系统的时候,在预计某某编号多少位可以够用的时候,都存在预计不准的风险。而采用自增长 primary key 则不存在这种问题。同样的道理,没有人可以去记这些号码。
使用自增长 primary key另外一个原因是性能问题。略有编程常识的人都知道,数字大小比较比字符串大小比较要快得多。使用自增长 primary key可以大大地提高数据查找速度。
2. 避免用复合主键 (compound primary key)
这主要还是因为性能问题。数据检索是要用到大量的 primary key 值比较,只比较一个字段比比较多个字段快很多。使用单个 primary key 从编程的角度也很有好处, sql 语句中 where 条件可以写更少的代码,这意味着出错的机会大大减少。
3. 双主键
双主键是指数据库表有两个字段,这两个字段独立成为主键,但又同时存在。 数据库系统的双主键最早用在用户管理模块。最早的来源可能是参照操作系统的用户管理模块。
操作系统的用户管理有两个独立的主键:操作系统自己自动生成的随机 ID (Linux, windows 的 SID), login id。这两个 ID 都必须是唯一的,不同的是,删除用户 test 然后增加一个用户 test, SID 不同,login id 相同。采用双主键主要目的是为了防止删除后增加同样的 login id 造成的混乱。比如销售经理 hellen 本机共享文件给总经理 peter, 一年后总经理离开公司,进来一个普通员工 peter ,两个peter 用同样的 login id, 如果只用 login id 作操作系统的用户管理主键,则存在漏洞:普通员工 peter 可以访问原来只有总经理才能看的文件。操作系统自己自动生成的随机 ID 一般情况下面用户是看不到的。
双主键现在已经广泛用在各种数据库系统中,不限于用户管理系统。
4. 以固定的数据库、表应付变化的客户需求
这主要基于以下几个因素的考虑:
4.1 大型 EPR 系统的正常使用、维护需要软件厂商及其众多的合作伙伴共同给客户提供技术服务,包括大量的二次开发。
如果用户在软件正常使用过程中需要增加新的表或者数据库,将给软件厂商及其众多的合作伙伴带来难题。
4.2 软件升级的需要。
没有一个软件能够让客户使用几十上百年不用升级的。软件升级往往涉及数据库表结构的改变。软件厂商会做额外的程序将早期版本软件的数据库数据升级到新的版本,但是对于用户使用过程中生成的表进行处理就比较为难。
4.3 软件开发的需要。
使用固定的数据库库表从开发、二次开发来说,更加容易。对于用户使用过程中生成的表,每次查找数据时都要先查表名,再找数据,比较麻烦。
举例来说,早期的用友财务软件用 Access 作数据库,每年建立一个新的数据库。很快,用户和用友公司都发现,跨年度数据分析很难做。因此这是一个不好的设计。在 ERP 中,很少有不同的年度数据单独分开。一般来说,所有年份的数据都在同一个表中。对于跨国公司甚至整个集团公司都用同一个 ERP 系统的时候,所有公司的数据都在一起。这样的好处是数据分析比较容易做。
现在大多数数据库系统都能做到在常数时间内返回一定量的数据。比如,Oracle 数据库中,根据 primary key 在 100万条数据中取 10 条数据,与在1 亿条数据中取 10 条数据,时间相差并不多。
5. 避免一次取数据库大量数据,取大量数据一定要用分页。
这基本上是现在很多数据库系统设计的基本守则。ERP 系统中超过 100万条数据的表很多,对于很多表中的任何一个,一次取所有的会导致数据库服务器长时间处于停滞状态,并且影响其它在线用户的系统响应速度。
一般来说,日常操作,在分页显示的情况下面,每次取得数据在 1-100 之间,系统响应速度足够快,客户端基本没有特别长的停顿。这是比较理想的设计。这也是大型数据库系统往往用 ODBC, ADO 等等通用的数据库联接组件而不用特定的速度较快的专用数据库联接组件的原因。因为系统瓶颈在于数据库( Database) 方面(数据量大),而不在于客户端(客户端每次只取少量数据)。
在 B/S 数据库系统中,分页非常普遍。早期的数据库系统经常有客户端程序中一次性取大量数据做缓冲。现在已经不是特别需要了,主要原因有:
5.1 数据库本身的缓冲技术大大提高。
大部分数据库都会自动将常用的数据自动放在内存中缓冲,以提高性能。
5.2 数据库联接组件的缓冲技术也在提高。
包括 ADO 在内的一些数据库联接组件都会自动对数据结果集(result set)进行缓冲,并且效果不错。比较新颖的数据库联接组件,比如 Hibernate 也加入了一些数据结果集缓冲功能。
当然,也有一些数据库联接组件没有对数据结果集进行缓冲,比如 JDBC Driver,不过几年之内情况应该有所改观。也有些不太成功的数据缓冲,比如 EJB 中的实体Bean,性能就不尽如人意,实体Bean数据也是放在内存中,可能是因为占用内存过多的缘故。
相对来说,今天的程序员写客户端数据缓冲,能够超过以上两个缓冲效果的,已经比较难了。
转载于:https://www.cnblogs.com/shao-shao/articles/3414493.html
大型ERP等数据库系统常见几种设计------(转)相关推荐
- 大型ERP等数据库系统常见几种设计
大型ERP等数据库系统常见几种设计 1. 自增长 primary key 采用自增长 primary key主要是性能.早期的数据库系统,经常采用某种编号,比如身份证号码,公司编号等等作为数据库表的 ...
- 常见三种陷波滤波器(Notch Filter)的离散化设计
为了学习陷波器,几乎把全网的陷波器有关文章都看了一遍,整理下,加深印象,也给后来的朋友作参考,文章内容大部分直接复制过来,但是所有内容代码我都测试了一遍,其中有些错误之处,也作了修改. 陷波滤波器形式 ...
- 常见三种存储方式DAS、NAS、SAN的架构及比较
随着主机.磁盘.网络等技术的发展,数据存储的方式和架构也在一直不停改变,本文主要介绍目前主流的存储架构. 存储的分类 根据服务器类型分为: 封闭系统的存储(封闭系统主要指大型机) 开放系统的存储(开放 ...
- 【数据库系统】第二部分 设计与应用开发(7) 数据库设计
本文属于「数据库系统」系列文章之一,这一系列着重于「数据库系统知识的学习与实践」.由于文章内容随时可能发生更新变动,欢迎关注和收藏数据库系统系列文章汇总目录一文以作备忘.需要特别说明的是,为了透彻理解 ...
- 常见的网页设计布局有哪些?优秀的网页设计都有的8个特点
网页布局在很大程度上决定了网站的用户如何和网页内容进行交互,好的网页设计具有很强的实用性和适应性,在进行网页设计时的更应该遵循网页布局的最佳实践效果,给观者带来最前沿最全新的网页体验,接下来一起来看看 ...
- 视频教程-大型ERP实战项目教程-Java
大型ERP实战项目教程 十年项目经验,曾经任职中国移动架构师,丰富的教学经验让无数人获得高薪 任亮 ¥1300.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订 ...
- 关于ACL和NAT技术(内含PC服务器常见三种类型介绍与通配符掩码简介)
目录 PC服务器常见三种外形介绍(硬盘尺寸相关知识普及) 一.塔式服务器 二.刀片式服务器 三.机架式服务器 四.硬盘尺寸 ACL 一.ACL概述及其组成 1.ACL的概述及技术背景 2.ACL的组成 ...
- 漫谈ERP实施服务的三种境界
一个ERP项目的成功并不代表一个行业的成功,一个ERP项目的失败并不意味着一个产品的失败.虽然不同的ERP实施模式在实施内容.实施流程.实施方法上大同小异,但不同的ERP实施境界所产生的效率.效果.效 ...
- 常见数字IC设计、FPGA工程师面试题
转载自:常见数字IC设计.FPGA工程师面试题 我怕弄丢了,找不到了,所以转载过来吧,回答的还挺具有参考意义. 借个位置,顺便把另外一篇好文的地址附上:FPGA中的亚稳态 1:什么是同步逻辑和异步逻辑 ...
最新文章
- 基于先验时间一致性车道线的IPM相机外参标定
- 文件解析库doctotext源码分析
- ELK环境搭建及client配置
- Fisher 线性分类器--转
- python 日期格式和字符串格式的转化
- [Android]AndroidBucket增加碎片SubLayout功能及AISubLayout的注解支持
- 【算法学习】B-Tree编程实现(C++模板类封装)
- 刚写完的商城erp + 这个商城前台,新鲜出炉。自己1个人写, 包括php框架和前端html页面....
- ActivityGroup和TabActiviy的差异性?
- windows配置java环境变量
- 一文搞懂程序流程图详解
- CLRvia3读书笔记
- 微信小程序疑难杂症---修改数组里的某个属性的值
- word文档太大怎么压缩?
- 对ashx请求用Gzip,Deflated压缩
- 糖尿病11年的隔壁老王
- 影视后期调色必要性以及操作理论
- 用计算机采集光栅尺的数据,基于PLC的光栅尺数据采集系统及方法与流程
- XShell 下载 安装
- VS2010出现重复的代码项原因及解决方式
热门文章
- 计算机应用技术备选计划方案,华东理工大学博士研究生培养方案计算机应用技术、计算机软件与理论、计算机系统结构二级学科(学科代码:081203、081202、081201)信息科学与工程学院...
- 怎么通过media foundation将图像数据写入虚拟摄像头_[Camera]摄像头镜像
- python random 和numpy random_Python中numpy.random和random.random之间的区别
- mysql proxy 管理_ProxyMySQL的Admin管理接口
- key位置 win10生成的ssh_Git实现ssh免密登录
- vs2013怎么清理解决方案_厕所漏水怎么办?厕所免拆砖防水维修方案
- 直接销毁_战机报废,发动机怎么处理?美国直接销毁,中国改造成扫雪神器
- mysql batch mode_MySQL数据库增量日志解析工具 Canal 实战
- android工程引入unity,Unity导出Android Studio工程
- 标定板标定和九点标定的区别_标定系列一 | 机器人手眼标定的基础理论分析