仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 801|回复: 9
打印 上一主题 下一主题

[学习教程] MSSQL网站制作之UML在干系型数据库计划中的使用

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:32:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
这类操作的执行过程是,1)按照新的表定义建立一个临时表tmpa,2)将原表数据拷贝到临时表,3)将原始表改名tmpb,4)将tmpa改名为原表名,5)将tmpb删除。计划|数据|数据库|数据库计划  1.先容

  很多人以为面向工具观点和干系型数据库互相纷歧致,而且不克不及分离。现实上完整相反!经由天真的利用,一个干系型数据库可以为面向工具(OO)模子供应一套优异的完成。一样的模子可以用来开辟编程代码和干系型数据库布局。

  干系型数据库手艺是意义深远的、壮大的,但它比很多开辟商使你信任的要可贵多。单个表是复杂易懂的、直不雅的。但由数以百计的表构成(这是罕见的)的使用要完全懂得是相称坚苦的。这恰是OO模子有效的地方。OO模子使你深切地、联贯地思索成绩。

  OO模子供应一种成绩的超布局(superstructure)的思索体例,然后该体例可以用干系型数据库的更低层的构成块来完成。

  本文章综合地会商了干系型数据库手艺,而不是会合于特定的产物上。我们将不会商物理计划细节(比方存储分派和物理会萃),由于它们是依附于产物的。

  用干系型数据库完成UML模子有两个方面:映照布局(第2节)和映照功效(第3节)。第4节注解了面向工具到干系型数据库的扩大。第5节总结本文章。

  2.布局映照到表

  UML工具模子在实质上只是一个扩大的实体-干系(ER)模子。利用计划数据库的ER模子的体例遭到广泛承受,而我们以一种近似的但更壮大的体例-利用UML工具模子。OO模子的次要上风在于编程和数据库的不异的模子事情。并且,作为思索功效性的一种体例(第3节),我们夸大OO模子的导航。这一节显现怎样完成UML工具模子的次要机关。

  2.1标识(identity)

  完成工具模子的第一步是处置标识。我们从界说几个术语入手下手。

  1)候选键(candidatekey)是一个或多个属性的组合,它独一地断定某个内外的纪录。一个候选键里的属性集必需是最小化的;除非损坏独一性,不然属性不克不及从候选键删除。候选键里的属性不克不及为空。

  2)主键(primarykey)是一个特定地选定的候选键,用来优先地参考纪录。

  3)外键(foreignkey)是一个候选键的参考。外键必需包含每一个要素属性的一个值,大概它必需全体为空。外键用来完成联系关系和一样平常化。

  一般地你应当为每一个表界说一个主键,只管偶然有破例。我们激烈倡议一切的外键都只指向主键而不是别的的候选键。

  界说主键有两种基础的办法:

  1)基于存在的标识。你应当为每一个类表加一个工具标识符属性,并将它设为主键。每一个联系关系表的主键包含一个或更多的相干类的标识符。基于存在的标识符有作为独自属性的上风,占位小且巨细不异。只需你的干系型数据库办理体系(RDBMS)受撑持,基于存在的标识符就没有功能的优势。(多半RDBMS供应无效的基于存在的标识符的分派按次号码。)独一的优势是基于存在的标识符在保护时内没有固有的意义。

  2)基于值的标识。一些实在天下的属性的组合断定了每一个工具。基于值的标识有分歧的上风。主键关于用户有固有的意义,简单举行调试和数据库保护。在另外一面,基于值的主键很难改动。一个主键的改动必要传布到很多外键。一些工具没有天然的实在天下里的标识符。

  我们保举你在凌驾30个类的RDBMS使用里利用基于存在的标识。基于存在和基于值的标识都是一切RDBMS使用的可行选项。

  2.2域(属性范例)

  属性范例是UML术语,对应于数据库著作里的域的术语。比起间接用数据范例,域提拔到更分歧的计划,并便当了使用的定位。

  复杂域很简单完成。你仅仅要界说响应的数据范例和巨细。而且每一个用了域的属性,你都必需为每一个域束缚到场一条SQL查询子句。复杂域的一些例子是:名字(name),长字符(longString)和德律风号码(phone-Number)。

  一个列举域把一个属性限定在一系列的值里。列举域比复杂域完成起来更庞大,图表1显现了四个办法。



图表1:列举的完成办法 

  2.3类

  一般情形下,我们把每一个类映照为一个表,每一个属性映照为一个列。你大概因一个已发生的标识符(基于存在的标识符)、埋没的联系关系(第2.4节)和通用判别器(第2.5节)必要一些别的的列。

  2.4联系关系

  如今我们会商联系关系的完成。我们已把我们的报告分为倡议的映照(我们一般利用的映照),可选的映照(我们偶然利用的映照)和不勉励的映照(我们碰到的应当制止的毛病)。我们一切的例子都接纳基于存在的标识。

  2.4.1倡议的映照

  多对多联系关系。用一个出格的表(图表2)来完成一个多对多联系关系。联系关系的主键是每一个类的主键的兼并。那些省略号(...)暗示在模子里没有显现出来的属性。主键用黑体字体显现。

  一对多联系关系。把一个外键埋没在“多”表(图表3)。脚色名字成为外键属性名字的一部分。

  零或一对一联系关系。把外键埋没在“零或一”表(图表4)。

  别的一对一联系关系。把外键埋没在任一内外。



图表2:倡议的完成:特别的多对多联系关系表



图表3:倡议的完成:埋没的一对多联系关系



图表4:倡议的完成:埋没的零或一对一联系关系

  可选的映照一般情形下我们利用倡议的映照。但有些偶然的情形,可选的映照更符合。

  出格的表。你也能够用出格的表(图表5)来完成一对多和一对一联系关系。出格的表给了你更一致的计划和更年夜的扩大性。不管怎样,出格的联系关系表打坏了数据库,并增添了表的数目。别的,出格的联系关系表不克不及强制一个更低的多重性限制为“一”。



图表5:可选的完成:出格的一对x联系关系表

  不勉励的映照我们已注重到有些开辟者选择出缺陷的映照。我们要注重这些映照以即可以免。兼并。不要兼并多个类,不要把联系关系强迫成为一个独自的表(图表6)。如许削减了表的数目,但会搅扰第三范式。

  两次埋没一对一联系关系。不要把一个一对一联系关系埋没两次,每次埋没在一个类里(图表7)。这是过剩的,无助于功能。

  不异的属性。不要用不异的属性来完成多个联系关系脚色(图表8)。不异的属性使编程庞大,下降了扩大性。泛化如今我们会商泛化。我们这里只叙述单个承继。倡议的映照最复杂的办法是只映照超类和每一个子类为一个表。一切的表共享一个配合的主键。使用必需实行子类的分别,由于RDBMS撑持。(关于后者的细致的形貌,请参阅第4节。)

  出格的表。映照超类和每一个子类为一个表(图表9)。一切的表共享一个配合的主键。判别器指出每一个子类纪录的得当的超类表。



图表9:倡议的完成:分隔的超类和子类表

  可选的映照泛化有几个可选的映照。打消。你能够优化撤除那些除主键外没有其余属性的类(图表10)。如许削减了表的数目,但供应更少的正轨完成。

  削减超类属性。你能够撤除超类表并把超类属性复制到每一个子类(图表11)。如许能够有形貌每一个工具为一个表的上风。不管怎样,它将引发数据库布局的冗余,你查找一个工具时大概必要搜刮多个子类表。

  增添子类属性。作为第三个可选项,你能够撤除子类表并存储一切的子类属性到超类内外(图表12)。如许用一个表形貌每一个工具,但搅扰了第二范式。



图表10:可选的完成:打消不用的子类表



图表11:可选的完成:削减超类属性  



图表12:可选的完成:增添子类属性 

  参考完全性一旦你已创建了表,你就应当界说参考完全性举措来明白工具模子的意义。(不要利用SQL触发器来完成参考完全性!)假如你利用基于存在的标识,你将不必要传布更新的了局。我们倡议以下对删除的参考完全性目标:泛化。级联从泛化完成中发生的外键的删除。

  埋没的联系关系,最小化多样性为零。一般地把外键设为空,但偶然候你大概要克制删除。

  埋没的联系关系,最小化多样性为空。你能够级联一个删除的了局大概克制该删除。

  联系关系表。一般地我们级联联系关系内外对纪录的删除。但是,偶然候我们克制一个删除。

  我们已扼要地论及参考完全性,由于它是个初级话题。参考有更多的注释z和例子。索引完成数据库布局的最初的一步是到场索引来调剂数据库功能。一般地,你应当为每一个主键和候选键界说一个独一的索引。(多半RDBMS作为SQL主键和候选键束缚的反作用来创建独一的索引。)你也应当为每一个被主键或候选键所束缚的外键创建一个索引。

  我们夸大索引的主要性。外键和主键的索引使在工具模子里能疾速地遍历是不容嫌疑的。你必需包含这些索引不然你将利用户感应悲观。你应当在你的数据库入手下手计划阶段里到场索引,由于它们很简单到场而且也没有甚么好来由推延到场。

  数据库办理员(DBA)大概为常常哀求的查询界说了分外的索引。DBA也大概接纳产物相干的调剂功能的机制。范式范式是干系型数据库计划的进步数据分歧性的无效办法。我们的书3会商了范式,但我们关于这个成绩却言过头微。我们将使用这篇文章的时机来廓清我们的概念。假如你不熟习范式你能够跳过这节。我们的申明是针对干系型计划职员,他们正在实验用面向工具顺应他们原本的妙技。

  范式是准确计划干系型数据库的准确的准绳。一样地,它们与利用了甚么开辟手艺是有关的-基于属性的计划、基于实体的计划、面向工具计划或别的甚么。已往利用基于属性计划的办法,开辟职员不能不十分注重范式;范式供应了分组数据的依据。相反地,范式关于基于面向工具(或基于实体)的开辟不是很主要。假如你接纳OO办法而且你的模子经由很好的构想,那你就正在把数据构造成为成心义的单元,也在实质上满意了范式的划定。假如你乐意,你仍可以反省范式,但如许的反省是不用要的。择要图表13总结了我们已报告的映照划定规矩。这些映照划定规矩的完全例子,包含一个UML工具模子,可以在这篇完全的扩大版本里找到(AdobeAcrobatPDF文件)。



图表13:保举的映照划定规矩的择要  

  把功效映照到SQL命令工具模子为数据库使用供应三种次要的用处。布局。工具模子指明数据库布局。我们已在第二节切磋了这个方面。

  束缚。工具模子也指了然能存储的数据上的主要的束缚。相婚配的完成必需为投合这些束缚而勉力。我们的映照划定规矩的处置办法和第二节里的参考完全性指出了很多束缚。(本文没有论及的别的的UML机关,能猎取更多的束缚。)

  潜伏预算。一个工具模子指明潜伏预算;它是关于引发哪些查询和怎样公式化的蓝图。第三节将扼要地分析第三个目标。

  工具模子不单单是主动的数据布局,相反它们可以匡助你思索一个使用的功效。你能够依据遍历一个工具模子说出它的很多功效。比方,依据我们对一个模子反省用例时的遍历,我们举行思考。这夸大工具模子的预算才能关于RDBMS使用是出格主要的,由于遍历表达式能够间接映照到SQL代码。

  UML工具束缚言语(ObjectConstraintLanguage,OCL)有助于表达遍历。点标记导航从工具到工具和工具到属性。方括号暗示工具汇合的过滤器。我们到场冒号(:)操纵符来暗示泛化的遍历;由于我们一般地用多个表来完成一个泛化承继,分明的遍历很有效。

  图表14里的遍历表达式例子是基于我们创立的UML工具模子上的(请参阅本文的扩大版本(AdobeAcrobatPDF文件)),我们把它们映照为SQL代码。我们用冒号入手下手SQL编程变量。



图表14:工具模子遍历和SQL代码的例子

  到RDBMS的OO扩大数据库整体对RDBMS的OO扩大有乐趣。产物和SQL尺度正实验到场到OO扩大里。我们将扼要地报告一下这个手艺的偏向。笼统数据范例(ADT)。这是个好主张,扩大RDBMS的才能。开辟商为这个手艺利用了很多名字,比方Oraclecartridge和Informixdatablades。ADT的弱点是它们把你牢牢绑在特定的一个开辟商上;ADT的范围超出了SQL尺度。因而,你应当只在ADT的优点很分明的时分才利用。

  在关于ADT怎样合适数据库开辟的著作里有一些凌乱。假如你利用OMT开辟历程,你可以用属性完成复杂域,用ADT完成庞大域。你仍应当用表完成类。SQL3指针。最新的SQL尺度的版本,SQL3,到场了作为一种数据范例的指针标记。明显,其企图是撑持导航和面向工具。我们关于SQL3指针最和睦的考语是,它们是嫁接的,是能够疏忽的。更深切的品评是,指针在实际上是荒唐的,增添了庞大性,又没有扩大SQL的表达才能。CJDate在前次的玄月工具/干系型集会上雄辩地会商了这一点。

  好了,那末我们冷漠地看待笼统数据范例和SQL指针的求全谴责。但我们相称喜好面向工具手艺和干系型数据库。有两个为RDBMS的扩大可使它们更简单用于OO手艺。我们将很愿意看到RDBMS开辟商把这些才能到场到他们的产物中。扩大的参考完全性举措来撑持泛化。以后的参考完全性机制是单向的。为了完整撑持泛化,我们必要一个双向的机制。如许,一条超类纪录就能够依附一便条类纪录。而且,一便条类纪录就能够依附一条超类纪录。我们经由过程例子能够最好地注释这点。

  图表15摘录于我们的在3的财政案例进修。我们用资产超类来一致某些没有显现在摘录里的通用的数据和功效。一项资产能够是一只股票或股票特权。一只股票能够有很多它的股票特权。比方,IBM股票能够有很多到达代价和过时日期的写下的放或叫特权。



图表15:参考完全性和泛化的例子

  我们保举的泛化完成是出格的表-映照该超类和每一个子类为一个表。然后,我们就能够利用参考完全性使股票特权和股票的纪录依附于资产。一个资产纪录的删除级联到响应的子类纪录、股票特权或股票的删除上。我们也可以界说一个参考完全性举措,如许一个股票的删除就级联到联系关系的股票特权纪录的删除。

  如今成绩以下。假如我们删除的一项资产是一只股票,资产纪录的删除级联到引发股票纪录的删除。随后,股票纪录的删除级联引发一切股票特权纪录的删除。但如今参考完全性使我们失利了:一个股票特权纪录的删除其实不引发一项资产纪录的删除。删除级联只能从超类走到子类。为了完整的举动,级联应当双向地走下往。

  以后有效的参考完全性的事情是做更多的编程(也即做更多的事情微风险更多妨碍)。在我们的用例进修的完成里,用户随时要删除一项是股票的资产,我们不能不誊写分外的代码来起首反省联系关系股票特权的存在性,然后删除它们。撑持交织表的纪录分别。独自承继(泛化的最多见体例)的寄义是一个超类的每一个实例都是用多半只要一个子类来例示。如今的RDBMS不克不及简单地增强这个束缚。比方,没有甚么避免上面的情况。一只股票能够用ID18到场到资产表,用ID18到场到股票表,而且也能够用ID18到场到股票特权表。再一次地,我们为了确信举动的完全,不能不作分外的编程,而不是写一个复杂的声明的束缚 

  结论

  本文报告了用干系型数据库完成UML模子的疾速的概不雅。我们但愿本文向你演示的手艺是充足合适的。一个练习有素的开辟职员可以用干系型数据库筹办一套优异的OO模子的完成。假如你要关于完成机制的更多的细节,参考3有别的的信息,而且也掩盖了我们没有在这里会商的一些初级模子建模布局。
提供用于管理、检查、优化数据库操作的管理工具。
若天明 该用户已被删除
沙发
发表于 2015-1-19 16:18:04 | 只看该作者
对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。
透明 该用户已被删除
板凳
发表于 2015-1-25 16:11:19 | 只看该作者
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
愤怒的大鸟 该用户已被删除
地板
发表于 2015-2-3 07:07:12 | 只看该作者
大家注意一点。如下面的例子:
admin 该用户已被删除
5#
发表于 2015-2-8 19:57:40 | 只看该作者
是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
金色的骷髅 该用户已被删除
6#
发表于 2015-2-26 01:35:06 | 只看该作者
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
兰色精灵 该用户已被删除
7#
发表于 2015-3-8 11:20:36 | 只看该作者
我个人认为就是孜孜不懈的学习
小妖女 该用户已被删除
8#
发表于 2015-3-15 22:24:07 | 只看该作者
分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。
因胸联盟 该用户已被删除
9#
发表于 2015-3-22 17:08:22 | 只看该作者
原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
海妖 该用户已被删除
10#
发表于 2015-3-22 17:08:22 | 只看该作者
两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-22 17:26

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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