`
serisboy
  • 浏览: 172175 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

数据库项目经验分享

 
阅读更多
 一、数据库的设计

  当然首先要懂得数据库的基本理论。在设计E-R模型之前,首先要进行深入的需求分析,需求了解的越透彻,数据模型才能越稳定。

  在E-R模型向关系模型转换时,既要深入理解规范化理论与转换原则,也要知道,并不是范式越高越好,为了加快查询速度可以适度加入冗余。非BCNF范式的关系虽然理论上可能会发生更新异常与冗余,但如果实际中该关系并不进行更新或更新的频度很小,其造成的负面影响也将十分有限。软件与数据库设计也是一门平衡的技术,范式究竟要达到什么程度,也要看具体的需求及平衡各方面的利弊,而没有一定之规。

  在物理设计方面,要考虑索引列及索引方法的选择,将可能同时频繁访问的数据在物理位置上分开,预计一定时期内数据的增长情况并预留出空间。需要强调(因为有不少朋友并没有意识到)的是索引不是越多越好,增加索引要慎重、要有充分的理由,增加索引会增加DML(增、删、改)操作的开销、会消耗更多的空间、还可能使原先好的查询执行计划变坏。

  有关历史数据的保留、清理与转储问题,应尽早了解用户这方面的需求,并制订合理的方案,否则可能给日后数据库的维护带来麻烦;最好能跟建设数据仓库项目结合起来考虑。

  另外,一定要利用成熟的设计工具(如IBM Rational Rose、PowerDesigner等等),这些工具使你的设计更规范、清晰、易于维护,还能产生各种报表供不同层面的人员查阅。

  二、应用软件开发

  关于这方面,我首先不赞成“一味强调软件的数据库独立性”,因为要达到该目的不仅非常困难而且成本很高。当然这也不是绝对的,也需要

  具体问题具体分析。关于这方面的详细论述,大家可以参看Thomas Kyte先生所著《Effective Oracle by Design》。

  另外,在编码调试时,开发环境应模拟真实的数据量,这样可以使许多性能问题提前暴露,有助于开发人员早期认识到性能的重要性。

  在对敏感数据(如用户口令)加密算法的选择上,不要相信数据经MD5摘要算法处理后就是安全的,现在网络上已出现相关的海量数据库,尽量穷举出各字符串对应的MD5摘要值并提供反向查询。如果口令设置得比较简单(如4位或6位全数字的口令),其被破解的可能性非常大。

  三、测试

  应组织专门的测试队伍对系统进行功能与性能方面的测试。

  应牢记,测试的目的是为了发现软件当中的错误,而不是证明软件的正确性。

  应针对不同应用建立其相应的性能测试环境,引入相关测试工具或根据实际情况自行开发一些测试驱动程序,检验系统对负荷的承载能力。

  四、数据库项目实施

  系统设备选型、规划时,不应只考虑一时的购买成本,还应考虑长远的维护成本。很多大型企业或机构在进行信息系统建设时,建设者与维护者分属不同的部门,有的建设部门往往孤立地看待每个项目,只考虑一时的购买成本,造成各类设备五花八门、平台异构情况极其复杂,不仅增大了日常维护的成本,还给日后各系统的集成与数据共享造成了很多麻烦。

  系统上线前,要充分重视原系统数据的转换与导入,做好细致的审核工作,确保数据的准确性。有条件的话建议进行新旧系统的并行测试。

  五、数据库运行维护

  建立完善的备份/恢复策略,并定期测试,确保系统发生故障时能确实恢复成功;备份与原始数据存放在不同的物理设备上。建立完善的数据库用户口令管理机制,规定口令的复杂度、有效期限等。在满足需求的前提下,尽量减少数据库用户的各类权限。每天检查数据库各种日志,定期进行阶段性的系统健康检查,尽早发现潜在的问题。实时监控数据库的运行状况,及时发现异常并处理。任何配置或数据结构的改动都要先在测试库测试成功后再应用到生产库,并准备应急恢复方案。根据运行状况,有计划地对数据库进行重组织。

  六、其它

  参加数据库应用项目的人员,要有很好的沟通能力与团队精神,这样才能保证项目的顺利完成;还要不断地学习相关的新知识、新技术(如存储、网络、安全等),有选择地应用到系统中去。

  最后强调一点“三分技术,七分管理,十二分的数据”可能被引用得有些俗了,但它确实是有关数据库应用经验的精辟概括与总结,对于大多数的数据库应用项目,技术方面往往不是决定项目成败最为关键的因素,而数据是否准确、管理是否规范与合理,才是更为关键的因素。

  应用难点技巧

  我想在这里还是有必要强调一下,关于数据库应用方面的学习,首先要重视的还是对基本理论、基本概念的理解,因为只有这样,在碰到问题的时候,才能比较容易地分析出问题的本质,并尽快找出问题的答案,自己找出解决问题的技巧。

  而许多在网上或书上、杂志出现的所谓技巧,往往都具有片面性或时间性,如果你不能认识到他们成立的条件,往往会备误导。

  比如你很可能听说过“查询中尽量不要用or,因为这样不能用到索引”,也许这个结论对多年前的某个数据库版本是成立的,某个人就把他作为技巧记录并从此传承下来了,但现在主要的数据库优化引擎经过多年的发展都没有这样的限制了,再死抱住这样的技巧也就不对了。

  再有关于子查询,有的人说不要用not in而有的人说不要用not exists,他们的结论可能在某些情况下都是正确的,但是都不具备普遍性。所以还是那句话,具体问题具体分析。

  以上是我对于技巧的一些看法,也可以算是我贡献给大家的“不是技巧的技巧”。

  下面,我也总结几条常见问题的处理技巧,供大家参考:

  1、关于Oracle字符集的设置,历来是各技术论坛经常被讨论的问题,但许多讨论都不彻底或有明显的错误,致使许多朋友在应用过程中出现乱码的烦恼。关于这方面的问题,大家可以参考《Oracle数据库字符集问题解析》一文(www.itpub.net/276524.html),其中最主要的请记住两点:(1)在数据库端:选择需要的字符集(通过create database中的CHARACTER SET与NATIONAL CHARACTER SET子句指定);(2)在客户端:设置操作系统实际使用的字符集(通过环境变量NLS_LANG设置)。

  2、Oracle 9i以来引入了“闪回”(flash back)功能,能够查询到不久前的时间点各表的数据情况,这对恢复人为差错造成的数据丢失很有用,不用使用备份及归档日志进行恢复,只要一个简单SQL即可恢复。如误删了某表的数据,可用形如下面的SQL进行恢复:

  insert into tab1

  select * from tab1 as of timestamp to_timestamp('200501010101','yyyymmddhh24mi')

  3、对于WEB查询结果集比较大,需要分页并排序显示的情况,在Oracle中可以采用形如下面的SQL:

  select *

  from ( select a.*, rownum r

  from ( select *

  from t

  where x = :host_variable

  order by y ) a

  where rownum < :HigherBound )

  where r > :LowerBound

  这样Oracle在决定执行计划时,可以不对整个结果集进行排序,而只需保证显示的当前页及之前的数据排序准确即可,系统效率得以提升。

  4、对于使用Oracle 数据库,但没有用到绑定变量的一些OLTP应用,可以考虑设置cursor_sharing参数强制使用绑定变量,我过去曾经做过一个测试,对于某个应用,强制使用绑定变量后在相同的负载情况下系统CPU使用率下降30%以上,当然也要注意使用该设置后一些大的统计查询SQL的执行计划有可能受到负面影响。所以,最好在开发阶段就使用绑定变量。

  5、对于Oracle数据库经常出现的ora 4031(unable to allocate %s bytes of shared memory)错误,首先应确定是否为Oracle的BUG所引起,尤其是ORACLE 8.1.7.0版本,存在内存泄露(memory leak)(bug no:1397603)的问题,解决的办法一是暂时设置内部参数_db_handles_cached =0,最终的解决方法是将ORACLE升级到8.1.7.2或更高的版本。如果确认不是Oracle的BUG,可以考虑利用oracle提供的包dbms_shared_pool将一些大的对象固定在共享内存中,或者加大共享内存。

  6、如果不能修改程序的源代码,而想调整或固定某些SQL的执行计划,可以利用Oracle提供的Stored Outline功能。

  7、对于Oracle 数据库,使用本地管理的表空间(而不使用传统的字典管理的表空间),使用自动段空间管理(ASSM,Automatic Segment Space Management)功能,并让Oracle自行管理回滚段,大多数情况下都会取得比较好的效果。

  8、对于提高Oracle 数据库的高可用性,建议实施Oracle Datagard中的physical standby,它所增加的成本与复杂性有限,但却极大地提高系统的可用性;而对于RAC,我认为是否实施应该谨慎,即使决定要实施也应该做非常充分的准备工作而不能盲目实施。我编写了一篇名为《不“为”浮云遮望眼——RAC可扩展性与高可用性思考》的文章,专门讨论了有关RAC的一些问题,如果有兴趣的朋友可以找我所要,共同探讨。

  9、如果很多人突然向你反映数据库很慢,最好先问清楚系统的配置或应用做了哪些改变,往往正是这些改变导致了系统性能的突变。

  10、遇到难题,可以先到一些著名的技术论坛搜索相关的主题,多数情况下你会找到问题的答案;如果没有找到,你可以发新贴咨询,听听大家的建议,往往会启发你的思路帮助你解决问题。

  有必要再次强调,上述有些技巧可能会随着数据库版本的变化及技术的发展而不再有效,所以还是请大家认真分析具体的应用环境并做充分的测试后,再加以应用。

转自http://tech.sina.com.cn/other/2006-07-26/10241055917.shtml
分享到:
评论

相关推荐

    搜狐畅游数据库运维经验分享

    - **经验分享**:畅游的经验分享聚焦于标准化、选型、监控与优化四个维度。标准化上线需求确保了项目的一致性与可预测性;选型与初始化的自动化大大减少了前期工作量;监控与预警机制是提前预防问题的关键;而数据库...

    第一个数据库项目

    在描述中提到了一个博客链接,虽然具体内容没有给出,但我们可以推测作者可能在博客中分享了项目的详细过程和经验。 标签 "源码" 和 "工具" 提示我们项目可能包含了源代码,可能是用某种编程语言(如SQL或Python)...

    2011-06-25_游戏数据库运维经验分享

    ### 游戏数据库运维经验分享 #### 一、引言 随着互联网技术的快速发展,网络游戏逐渐成为人们娱乐生活的重要组成部分。然而,在享受游戏带来的乐趣的同时,背后支撑这一切正常运行的游戏数据库运维工作却鲜为人知...

    搜狐畅游数据库运维经验分享.pdf

    ### 搜狐畅游数据库运维经验分享 #### 一、背景与挑战 随着网络游戏行业的快速发展,作为国内知名的游戏开发商之一,搜狐畅游面临着前所未有的挑战。特别是在数据库运维方面,随着在线用户数量的激增以及游戏种类...

    公司数据库设计规范,提供数据库设计的项目经验

    本文将深入探讨"XX公司数据库设计规范",分享实际项目经验,帮助读者理解并掌握数据库设计的关键要点。 首先,规范化的数据库设计是确保数据一致性、完整性和可维护性的基础。在XX公司的实践中,遵循以下主要步骤:...

    软件工程面试项目经验

    通过对项目经验的分享,软件工程师可以展示自己的技术能力、项目管理能力和团队协作能力。本文将通过四个项目经验的分享,展示软件工程师在不同项目中的角色和贡献。 项目一:网上购物系统项目 在这个项目中,软件...

    2013年中国数据库大会-45-分享dba团队管理和发展

    在中国数据库大会的分享中,DBA团队管理和发展是数据库管理领域的重要议题。DBA,即数据库管理员,是负责数据库设计、实施、维护和优化的专业人员。他们的工作不仅涉及技术层面,还包含了团队协作、项目管理等。从...

    跨数据中心的数据库双活及灾备建设经验分享

    ### 跨数据中心的数据库双活及灾备建设经验分享 #### 一、项目背景与目标 ##### 1.1 背景 随着信息技术的快速发展,金融行业面临着日益严峻的安全挑战和技术变革。对于银行而言,确保核心系统的稳定性和可靠性至...

    银行项目经验分享PPT学习教案.pptx

    【银行项目经验分享】银行项目的实施涉及多个方面,包括技术实施、业务理解、系统架构、问题处理和团队协作。在银行项目中,IT行业的价值尤为突出,尤其在金融领域,银行系统的开发是至关重要的。 首先,银行项目的...

    贪吃蛇(连接数据库)无需资源分

    【贪吃蛇(连接数据库)】程序是一款使用C#编程语言开发的游戏,它结合了数据库技术,能够自动保存玩家的分数。...同时,对于有经验的开发者,这个项目展示了如何利用现有技术创造有趣且实用的应用。

    数据库开发项目资源大全-涵盖主流数据库及其管理工具

    内容概要:本文详细列举了进行数据库开发项目所需的关键资源与工具,涵盖了多个主流数据库系统(如MySQL、PostgreSQL、SQLite)及其官方...此外,也可以加入提到的技术社区参与讨论与分享经验,解决实践中遇到的问题。

    数据库学习日积月累资料

    描述中提到的"一年多的软件开发经验"意味着这份资料可能涵盖了实战案例和经验分享,这对于学习者来说是非常宝贵的。实践中遇到的问题和解决方案,往往能提供更深入的理解,比如事务处理、并发控制、备份与恢复策略、...

    分享一个神奇的空间数据库

    描述中提到的博文链接指向iteye博客上的一篇文章,虽然具体内容未提供,但我们可以推测文章可能介绍了PostgreSQL空间数据库的使用经验、功能特性或者在实际项目中的应用案例。作者赵欣胜可能分享了关于如何利用这个...

    JAVA与数据库实训项目实习感想心得体会9篇范文

    在进行JAVA与数据库实训项目的过程中,我们不仅学习了理论知识,更重要的是获得了实践操作的宝贵经验。这九篇范文正是这种实践经验的结晶,涵盖了不同阶段、不同层面的学习感悟。每一篇都承载着作者对技术理解的深入...

    基于react+javaspring+mysql的知识分享系统源码+数据库.zip

    基于react+javaspring+mysql的知识分享系统源码+数据库.zip 本系统前端基于react+antd组件库实现;后台采用springMVC+mysql实现。 本系统是一个知识分享系统,可在本系统发布文章与别人分享自己的知识;可申请管理...

    25日更新-数据库实战论坛

    通过这次论坛的分享和讨论,参会者不仅能了解当前数据库领域的热点问题,还能获得实际操作中的宝贵经验,为自身的技术成长和项目优化提供有力支持。同时,这也是一个与同行交流、建立专业网络的良机。

    韩顺平时尚购物网全部代码+商城数据库(分享了)

    这个项目涵盖了从前端用户界面到后端服务器逻辑以及数据库管理的全方位知识。通过分析和实践这个项目的代码,我们可以深入学习以下几个关键的IT知识点: 1. **Web前端开发**:前端代码通常包括HTML、CSS和...

    银行核心数据库平台 Power 升级经验分享.docx

    【银行核心数据库平台 Power 升级经验分享】 在金融行业中,确保系统业务连续性至关重要,尤其是对于银行的核心系统。随着硬件设备使用年限的增长,为了保持业务的稳定运行,需要实施有效的硬件平台升级策略。在本...

    数据库和中间件公开技术分享

    在本次的“数据库和中间件公开技术分享”中,我们将探讨云原生时代下,OPPO公司在中间件和数据库领域的实践经验。技术分享的核心是优化企业的IT基础设施,提高系统的效率、可扩展性和可靠性,以适应快速变化的业务...

    NoSQL数据库技术实战

    项目开发部分,作者会分享如何在实际项目中选择合适的NoSQL数据库,设计高效的数据模型,以及优化查询性能。这部分内容对于开发者来说尤其实用,可以帮助他们避免常见陷阱,提升项目实施效率。 总的来说,《NoSQL...

Global site tag (gtag.js) - Google Analytics