兰色精灵 发表于 2015-1-16 22:15:11

MYSQL网站制作之年夜型数据库计划必要注重的一些准绳

由于在MySQL中有如此众多的额外功能可选,诸如存储引擎等,你可以选择最适合你公司的一个,或者尝试选用多个引擎。MySQL开始非常小巧,但是可以随着公司的成长而不断地变强大。  一个好的数据库产物不即是就有一个好的使用体系,假如不克不及计划一个公道的数据库模子,不但会增添客户端和服务器段程序的编程和保护的难度,并且将会影响体系实践运转的功能。一样平常来说,在一个MIS体系剖析、计划、测试和试运转阶段,由于数据量较小,计划职员和测试职员常常只注重到功效的完成,而很难注重到功能的亏弱的地方,比及体系投进实践运转一段工夫后,才发明体系的功能在下降,这时候再来思索进步体系功能则要消费更多的人力物力,而全部体系也不成制止的构成了一个打补钉工程。笔者根据多年来计划和利用数据库的履历,提出以下一些计划原则,供同仁们参考。
  定名的标准
  分歧的数据库产物对工具的定名有分歧的请求,因而,数据库中的各类工具的定名、背景程序的代码编写应接纳巨细写敏感的情势,各类工具定名长度不要凌驾30个字符,如许便于使用体系顺应分歧的数据库。
  游标(Cursor)的慎用
  游标供应了对特定汇合中逐行扫描的手腕,一样平常利用游标逐行遍历数据,依据掏出的数据分歧前提举行分歧的操纵。特别对多表和年夜表界说的游标(年夜的数据汇合)轮回很简单使程序进进一个冗长的等特乃至逝世机,笔者对某市《住房公积金办理体系》举行日终帐户滚积数计息处置时,对一个10万个帐户的游标处置招致程序进进了一个无穷期的等特(后经测算需48个小时才干完成)(硬件情况:Alpha/4000128Mram,ScoUnix,Sybase11.0),后依据分歧的前提改成用分歧的UPDATE语句得以在二非常钟以内完成。示比方下:
  DeclareMycursorcursorforselectcount_nofromCOUNT
  OpenMycursor
  FetchMycursorinto@vcount_no
  While(@@sqlstatus=0)
  Begin
  If@vcount_no=’’前提1
  操纵1
  If@vcount_no=’’前提2
  操纵2
  ……
  FetchMycursorinto@vcount_no
  End
  ……
  ……
  改成
  UpdateCOUNTset操纵1for前提1
  UpdateCOUNTset操纵2for前提2
  ……
  ……
  在有些场所,偶然也非得利用游标,此时也可思索将切合前提的数据行转进一时表中,再对一时表界说游标举行操纵,可时功能失掉分明进步。笔者在某地市〈电信免费体系〉数据库背景程序计划中,对一个表(3万行中切合前提的30多行数据)举行游标操纵(硬件情况:PC服务器,PII26664Mram,NT4.0MsSqlserver6.5)。示比方下:
  Create#tmp/*界说一时表*/
  (字段1
  字段2
  ……
  )
  Insertinto#tmpselect*fromTOTALwhere
  前提/*TOTAL中3万行切合前提只要几十行*/
  DeclareMycursorcursorforselect*from#tmp
  /*对一时表界说游标*/
  ……
  索引(Index)的利用准绳
  创立索引一样平常有以下两个目标:保护被索引列的独一性和供应疾速会见表中数据的战略。年夜型数据库有两种索引即簇索引和非簇索引,一个没有簇索引的表是按堆布局存储数据,一切的数据均增加在表的尾部,而创建了簇索引的表,其数据在物理上会依照簇索引键的按次存储,一个表只同意有一个簇索引,因而,依据B树布局,能够了解增加任何一种索引均能进步按索引列查询的速率,但会下降拔出、更新、删除操纵的功能,特别是当添补因子(FillFactor)较年夜时。以是对索引较多的表举行频仍的拔出、更新、删除操纵,建表和索引时应设置较小的添补因子,以便在各数据页中留下较多的自在空间,削减页支解及从头构造的事情。
  数据的分歧性和完全性
  为了包管数据库的分歧性和完全性,计划职员常常会计划过量的表间联系关系(Relation),尽量的下降数据的冗余。表间联系关系是一种强迫性措施,创建后,对父表(ParentTable)和子表(ChildTable)的拔出、更新、删除操纵均要占用体系的开支,别的,最好不要用Identify属性字段作为主键与子表联系关系。假如数据冗余低,数据的完全性简单失掉包管,但增添了表间毗连查询的操纵,为了进步体系的呼应工夫,公道的数据冗余也是需要的。利用划定规矩(Rule)和束缚(Check)来避免体系操纵职员误输出形成数据的毛病是计划职员的另外一种经常使用手腕,可是,不用要的划定规矩和束缚也会占用体系的不用要开支,必要注重的是,束缚对数据的无效性考证要比划定规矩快。一切这些,计划职员在计划阶段应依据体系操纵的范例、频度加以平衡思索。
  事件的圈套
  事件是在一次性完成的一组操纵。固然这些操纵是单个的操纵,SQLServer可以包管这组操纵要末全体都完成,要末一点都不做。恰是年夜型数据库的这一特征,使得数据的完全性失掉了极年夜的包管。
  尽人皆知,SQLServer为每一个自力的SQL语句都供应了隐含的事件把持,使得每一个DML的数据操纵得以完全提交或回滚,可是SQLServer还供应了显式事件把持语句
  BEGINTRANSACTION入手下手一个事件
  COMMITTRANSACTION提交一个事件
  ROLLBACKTRANSACTION回滚一个事件
  事件能够嵌套,能够经由过程全局变量@@trancount检索到毗连的事件处置嵌套条理。必要加以出格注重而且极简单使编程职员出错误的是,每一个显现或隐含的事物入手下手都使得该变量加1,每一个事件的提交使该变量减1,每一个事件的回滚城市使得该变量置0,而只要当该变量为0时的事件提交(最初一个提交语句时),这时候才把物理数据写进磁盘。
  数据库功能调剂
  在盘算机硬件设置和收集计划断定的情形下,影响到使用体系功能的要素不过乎为数据库功能和客户端程序计划。而年夜多半数据库计划员接纳两步法举行数据库计划:起首举行逻辑计划,尔后举行物理计划。数据库逻辑计划往除一切冗余数据,进步了数据吞吐速率,包管了数据的完全性,分明地表达数据元素之间的干系。而关于多表之间的联系关系查询(特别是年夜数据表)时,其功能将会下降,同时也进步了客户端程序的编程难度,因而,物理计划需折中思索,依据营业划定规矩,断定对联系关系表的数据量巨细、数据项的会见频度,对此类数据表频仍的联系关系查询应得当进步数据冗余计划。
  数据范例的选择
  数据范例的公道选择关于数据库的功能和操纵具有很年夜的影响,有关这方面的书本也有很多的论述,这里次要先容几点履历。
  Identify字段不要作为表的主键与别的表联系关系,这将会影响到该表的数据迁徙。
  Text和Image字段属指针型数据,次要用来寄存二进制年夜型工具(BLOB)。这类数据的操纵比拟别的数据范例较慢,因而要避开利用。
  日期型字段的长处是有浩瀚的日期函数撑持,因而,在日期的巨细对照、加减操纵上十分复杂。可是,在依照日期作为前提的查询操纵也要用函数,比拟别的数据范例速率上就慢很多,由于用函数作为查询的前提时,服务器没法用先辈的功能战略来优化查询而只能举行表扫描遍历每行。
  比方:要从DATA_TAB1中(个中有一个名为DATE的日期字段)查询1998年的一切纪录。
  Select*fromDATA_TAB1wheredatepart(yy,DATE)=1998
<Pstyle="TEXT-INDENT:2em">
由于在MySQL中有如此众多的额外功能可选,诸如存储引擎等,你可以选择最适合你公司的一个,或者尝试选用多个引擎。MySQL开始非常小巧,但是可以随着公司的成长而不断地变强大。

若天明 发表于 2015-1-19 06:02:49

个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。

分手快乐 发表于 2015-1-26 20:23:58

换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的

深爱那片海 发表于 2015-2-4 21:11:41

换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的

海妖 发表于 2015-2-10 11:11:27

可以动态传入参数,省却了动态SQL的拼写。

小魔女 发表于 2015-3-1 10:32:02

你可以简单地认为适合的就是好,不适合就是不好。

admin 发表于 2015-3-17 08:53:45

不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?

小女巫 发表于 2015-3-24 04:43:43

如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
页: [1]
查看完整版本: MYSQL网站制作之年夜型数据库计划必要注重的一些准绳