从类模型映射到关系模型.docx
- 文档编号:26065653
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:16
- 大小:65.25KB
从类模型映射到关系模型.docx
《从类模型映射到关系模型.docx》由会员分享,可在线阅读,更多相关《从类模型映射到关系模型.docx(16页珍藏版)》请在冰豆网上搜索。
从类模型映射到关系模型
根据领域模型分析数据模型
MappingfromtheClassModeltotheRelationalModel
从类模型映射到关系模型
Havingdescribedthetwodomainsofinterestandthenotationtobeused,wecannowturnourattentionastohowtomaportranslatefromonedomaintotheother.Thestrategyandsequencepresentedbelowismeanttobesuggestiveratherthanproscriptive-adaptthestepsandprocedurestoyourpersonalrequirementsandenvironment.
在需要对两个领域建模时,现在我们可以关注如何从一个领域映射或转换映射到另一个领域。
以下的策略和方法,就是要启发,而不是强制的步骤和程序应用到您的个人需求和环境。
1.ModelClasses
Firstlywewillassumeweareengineeringanewrelationaldatabaseschemafromaclassmodelwehavecreated.Thisisobviouslytheeasiestdirectionasthemodelsremainunderourcontrolandwecanoptimisetherelationaldatamodeltotheclassmodel.Intherealworlditmaybethatyouneedtolayeraclassmodelontopofalegacydatamodel-amoredifficultsituationandonethatpresentsitsownchallenges.Forthecurrentdiscussionwillfocusonthefirstsituation.Ataminimum,yourclassmodelshouldcaptureassociations,inheritanceandaggregationbetweenelements.
1.类建模
首先,我们将假设从已创建的类模型生成一个新的关系数据库模型。
这显然是最容易的,可控制的,可以通过关系数据库模型反向优化类模型。
在现实世界中可能你需要将类模型作为数据模型的上层,这是更困难的情况,也对自己提出了一个挑战。
对于目前的讨论将集中在第一种情况。
至少,你的类模型应捕元素之间的联系、继承和聚集关系。
2.Identifypersistentobjects
Havingbuiltourclassmodelweneedtoseparateitintothoseelementsthatrequirepersistenceandthosethatdonot.Forexample,ifwehavedesignedourapplicationusingtheModel-View-Controllerdesignpattern,thenonlyclassesinthemodelsectionwouldrequirepersistentstate.
2.确认持久对象
已建成的类模型,我们需要区分这些元素,那些需要持久化和那些不是。
例如,如果我们设计我们的应用程序使用Model-View-Controller设计模式,那么只有MODEL模型部分需要持久化状态。
3.Assumeeachpersistentclassmapstoonerelationaltable
Afairlybigassumption,butonethatworksinmostcases(leavingtheinheritanceissueasideforthemoment).Inthesimplestmodelaclassfromthelogicalmodelmapstoarelationaltable,eitherinwholeorinpart.Thelogicalextensionofthisisthatasingleobject(orinstanceofaclass)mapstoasingletablerow.
3.假设一个持久化类映射一个关系表
大多数情况下,这都是一个合理的假设,除去继承问题以外(暂且不考虑)。
在最简单的模型中,逻辑模型中的一个类映射一个关系表的全部或一部分。
这种逻辑的延伸是一个单一的对象(或类的实例)映射关系表中的一行数据。
4.Selectaninheritancestrategy.
Inheritanceisperhapsthemostproblematicrelationshipandlogicalconstructfromtheobject-orientedmodelthatrequirestranslatingintotherelationalmodel.Therelationalspaceisessentiallyflat,everyentitybeingcompleteinitsself,whiletheobjectmodelisoftenquitedeepwithawell-developedclasshierarchy.Thedeepclassmodelmayhavemanylayersofinheritedattributesandbehaviour,resultinginafinal,fullyfeaturedobjectatrun-time.Therearethreebasicwaystohandlethetranslationofinheritancetoarelationalmodel:
4.选择一个继承策略
从面向对象模型转化成关系模型的过程中,继承可能是最有问题的关系和逻辑结构。
关系空间本质上是平面结构,每一个实体自我实现,而对象模型通常为多层次扩展的类结构。
多层级类模型可能有多层次继承的属性和行为,最终结果,运行时功能齐全的对象。
有三种基本方式对继承关系转换成关系模型:
a.Eachclasshierarchyhasasinglecorrespondingtablethatcontainsalltheinheritedattributesforallelements-thistableisthereforetheunionofeveryclassinthehierarchy.Forexample,Person,Parent,ChildandGrandchildmayallformasingleclasshierarchy,andelementsfromeachwillappearinthesamerelationaltable;
类层次结构有只有一个相应的表,包含所有元素的所有继承的属性。
因此这个表是类层次结构中所有类的联合。
例如,人,父母,子女和孙子都可能形成一个单一的类层次结构,单所有元素将出现在同一个关系表中;
b.Eachclassinthehierarchyhasacorrespondingtableofonlytheattributesaccessiblebythatclass(includinginheritedattributes).Forexample,ifChildisinheritedfromPersononly,thenthetablewillcontainelementsofPersonandChildonly;
层次结构中每个类都有一个相应的表。
表中包含类所要访问的所有属性(包括继承的属性)。
例如,如果孩子继承人,则该表将包含个人与儿童所有的元素;
c.Eachgenerationintheclasshierarchyhasatablecontainingonlythatgeneration'sactualattributes.Forexample,ChildwillmaptoasingletablewithChildattributesonly
在类结构中,每一层有一个表,包含这一层的实际属性。
例如,Child将映射大偶一个简单表,只包含汉字的属性。
Therearecasestobemadeforeachapproach,butIwouldsuggestthesimplest,easiesttomaintainandlesserrorproneisthethirdoption.Thefirstoptionprovidesthebestperformanceatrun-timeandthesecondisacompromisebetweenthefirstandlast.Thefirstoptionflattensthehierarchyandlocatesallattributesinonetable-convenientforupdatesandretrievalsofanyclassinthehierarchy,butdifficulttoauthenticateandmaintain.Businessrulesassociatedwitharowarehardtoimplement,aseachrowmaybeinstantiatedasanyobjectinthehierarchy.Thedependenciesbetweencolumnscanbecomequitecomplicated.Inaddition,anupdatetoanyclassinthehierarchywillpotentiallyimpacteveryotherclassinthehierarchy,ascolumnsareadded,deletedormodifiedfromthetable.
以上的方法都有成功的案例,但我认为最简单,最容易维护和减少出错是第三个选择。
第一个选项提供在运行时的最佳性能,第二个是第一个和最后一个方法的妥协。
第一个选项把层次结构变成了平面结构,定义所有属性在一个表中-便于更新和检索层次结构中任何类,但难以验证和维护。
与行相关的业务规则难以实现,因为每行可以作为层次结构中任何对象实例化。
列间的依赖关系可能会变得非常复杂。
此外,在更新层次结构中的任何类将有可能影响层次结构中的所有其
他类,例如对表进行添加,删除或修改列。
Thesecondoptionisacompromisethatprovidesbetterencapsulationandeliminatesemptycolumns.However,achangetoaparentclassmayneedtobereplicatedinmanychildtables.Evenworse,theparentaldataintwoormorechildclassesmayberedundantlystoredinmanytables;ifaparent'sattributesaremodified,thereisconsiderableeffortinlocatingdependentchildrenandupdatingtheaffectedrows.
第二种选择是一个妥协方案,提供更好的封装和消除空列。
但是,对父类的改变可能需要重复对多个子表的进行修改。
更糟的是,在两个或更多孩子的父类数据可能冗余存储在多个表中,如果一个父类的属性被修改,那么定位产生影响的行数据的子表,并进行修改,将需要非常大的工作。
Thethirdoptionmoreaccuratelyreflectstheobjectmodel,witheachclassinthehierarchymappedtoitsownindependenttable.Updatestoparentsorchildrenarelocalisedinthecorrectspace.Maintenanceisalsorelativelyeasier,asanymodificationofanentityisrestrictedtoasinglerelationaltablealso.Thedownsideistheneedtore-constructthehierarchyatrun-timetoaccuratelyre-createachildclass'sstate.AChildobjectmayrequireaPersonmembervariabletorepresenttheirmodelparentage.Asbothrequireloading,twodatabasecallsarerequiredtoinitialiseoneobject.Asthehierarchydeepens,withmoregenerations,thenumberofdatabasecallsrequiredtoinitialiseorupdateasingleobjectincreases.
第三个方案更准确地反映了对象模型,在层次结构中每个类映射到它自己独立的表中。
父类和子类的更新定位于正确的空间。
维护也相对容易,任何一个实体的改变也能限制到一个单一的关系表中。
不利的一面是,在运行时需要重新构造层次结构,以准确的重建子类的状态。
子对象可能需要一个角色成员变量来表示他们的父子模型关系。
初始化一个对象时需要两个表同时加载,两次数据库调用。
对于多层结构,初始化或更新一个简单对象时,数据库调用的数量增加。
Itisimportanttounderstandtheissuesthatarisewhenyoumapinheritanceontoarelationalmodel,soyoucandecidewhichsolutionisrightforyou.
重要的是要了解把继承关系映射到关系模型可能出现的问题,以便决定哪个解决方案最适合您。
5.Foreachclassaddauniqueobjectidentifier
Inboththerelationalandtheobjectworld,thereistheneedtouniquelyidentifyanobjectorentity.Intheobjectmodel,non-persistentobjectsatrun-timearetypicallyidentifiedbydirectreferenceorbyapointertotheobject.Onceanobjectiscreated,wecanrefertoitbyitsrun-timeidentity.However,ifwewriteoutanobjecttostorage,theproblemishowtoretrievetheexactsameinstanceondemand.ThemostconvenientmethodistodefineanOID(objectidentifier)thatisguaranteedtobeuniqueinthenamespaceofinterest.Thismaybeattheclass,packageorsystemlevel,dependingonactualrequirements.
5.为每个类添加唯一对象标识
在关系和对象世界中,都需要唯一标识一个对象或实体。
在对象模型中,在运行时,非持久性对象通常由直接引用或者指针进行标识。
一旦对象被创建,我们能够参考它通过它的运行时标识。
但是,如果我们把对象输出到存储介质中,问题是当需要时,如何准确的重新获取相同的实例。
最简便的方法是定义一个OID(对象标识符),是保证在关注的命名空间唯一性。
也可能是在类,包或系统级中根据实际要求进行定义。
AnexampleofasystemlevelOIDmightbeaGUID(globallyuniqueidentifier)createdwithMicrosoft's'guidgen'tool;eg.{A1A68E8E-CD92-420b-BDA7-118F847B71EB}.AclasslevelOIDmightbeimplementedusingasimplenumeric(eg.32bitcounter).Ifanobjectholdsreferencestootherobjects,itmaydosousingtheirOID.Acompleterun-timescenariocanthenbeloadedfromstoragereasonablyefficiently.AnimportantpointabouttheOIDvaluesaboveisthattheyhavenoinherentmeaningbeyondsimpleidentity.Theyareonlylogicalpointersandnothingmore.Intherelationalmodel,thesituationisoftenquitedifferent.
一个系统级的OID可能是一个微软的'guidgen'工具创建的GUID(全局唯一标识符);例如。
{A1A68E8E-CD92-420b-BDA7-118F847B71EB}。
类级别的OID可能是通过使用一个简单的数字(如32位计数器)。
如果一个对象包含其他对象的引用,它可以使用他们的OID。
在运行时,一个完整结构可以从存储介质中被合理有效载入。
一个关于上述OID值重要的一点是,他们没有超越作为简单标识以外的含义。
他们是唯一合乎逻辑的指针而已。
在关系模型中,情况往往大不相同。
Identityintherelationalmodelisnormallyimplementedwithaprimarykey.Aprimarykeyisasetofcolumnsinatablethattogetheruniquelyidentifyarow.Forexample,nameandaddressmayuniquelyidentifya'Customer'.Whereotherentities,suchasa'Salesperson',referencethe'Customer',theyimplementaforeignkeybasedonthe'Customer'primarykey.Theproblemwiththisapproachforourpurposesistheimpactofhavingbusinessinformation(suchascustomernameandaddress)embeddedintheidentifier.Imaginethreeorfourtablesallhaveforeignkeysbasedonthecustomerprimarykey,andasystemchangerequiresthecustomerprimarykeytochange(forexampletoinclude'customertype').Theworkrequiredtomodifyboththe'customer'tableandtheentitiesrelatedbyforeignkeyisquitelarge.
在关系模型中的标识通常作为一个主键。
主键是一个表中唯一标识一行的列集合。
例如,姓名和地址可以唯一地标识一个'客户'。
当其他实体,例如,一个'推销员',参考'客户'时,以'客户'的主键为基础,创建一个外键的。
用这个方法的问题是有业务信息在标识中(如客户名称和地址),可能跟真实目的产生冲突。
想象一下,三个或四个表中都有外键和基于客户表的主键,如果一个系统需要改变客户表的主键(例如包括'客户类型')。
修改'客户'表和通过外键关联的实体的工作是相当大的。
Ontheotherhand,ifanOIDwasimplementedastheprimarykeyandformedtheforeignkeyforothertables,thescopeofthechangeislimitedtotheprimarytableandtheimpactofthechangeisthereforemuchless.Also,inpractice,aprimarykeybasedonbusinessdatamaybesubjecttochange.Forexampleacustomermaychangeaddressorname.Inthiscasethechangesmustbepropagatedcorrectlytoallotherrelatedentities,notto
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模型 映射 关系