开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6308|回复: 19
收起左侧

[MSSQL] 大型ERP数据库系统常见设计(转载)

[复制链接]
结帖率:50% (1/2)
发表于 2012-12-1 18:59:23 | 显示全部楼层 |阅读模式   苏里南
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 系统的正常使用、维护需要软件厂商及其众多的合作伙伴共同给客户提供技术服务,包括大量的二次开发。


本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考:http://www.zxbc.cn/a/erp/20100508093505.html
结帖率:50% (1/2)
 楼主| 发表于 2012-12-1 19:07:36 | 显示全部楼层   苏里南
如果用户在软件正常使用过程中需要增加新的表或者数据库,将给软件厂商及其众多的合作伙伴带来难题。
    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数据也是放在内存中,可能是因为占用内存过多的缘故。
相对来说,今天的程序员写客户端数据缓冲,能够超过以上两个缓冲效果的,已经比较难了。

本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考:http://www.zxbc.cn/a/erp/20100508093505_3.html

本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考:http://www.zxbc.cn/a/erp/20100508093505_2.html
回复 支持 反对

使用道具 举报

结帖率:61% (35/57)
发表于 2012-12-1 19:17:13 | 显示全部楼层   海南省海口市
不会。。。。支持转载。。更支持你转账给我
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 21 天

发表于 2012-12-1 20:04:18 | 显示全部楼层   陕西省西安市
留个标记!    转来的都不错!
回复 支持 反对

使用道具 举报

结帖率:27% (4/15)
发表于 2012-12-5 17:18:49 | 显示全部楼层   河南省洛阳市
我对这些基本就不懂。。
回复 支持 反对

使用道具 举报

结帖率:17% (1/6)
发表于 2013-4-6 04:19:25 | 显示全部楼层   北京市北京市
路过学习了一下。
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2013-4-6 10:10:09 | 显示全部楼层   甘肃省兰州市
有点高深,顶一下
回复 支持 反对

使用道具 举报

发表于 2013-4-7 15:29:34 | 显示全部楼层   福建省漳州市
学起来有点难。



回复 支持 反对

使用道具 举报

发表于 2014-9-19 18:28:50 | 显示全部楼层   四川省资阳市
支持下楼主,继续加油啊!!!!!
回复 支持 反对

使用道具 举报

发表于 2014-10-15 13:56:55 | 显示全部楼层   广东省东莞市
不错的软件,学习了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表