(Два гады таму, ва ў TechEd Microsoft ў Сан-Дыега, я прымаў удзел у гутарцы на пасля-канферэнцыі падзеі з Гары Пірсан і Clemens Vasters, і што характэрна, калі трое з нас збіраюцца разам, архітэктурныя тэмы былі ў авангардзе нашай дыскусіі. натоўп сабралася вакол нас, і ён ператварыўся ў імправізаваны птушак-з-пяро-сесіі. прадметам аб'ект / рэляцыйнай тэхналогіі адлюстравання падышоў, і менавіта там і тады, што я першы прыдумаў фразу, "Аб'ект / рэляцыйныя адлюстравання В'етнам кампутарных навук ". У прамежкавы перыяд, я атрымаў шматлікія просьбы, каб канкрэтызаваць абмеркаванне за гэта заяву, і ўлічваючы нядаўнюю заяву Microsoft адносна" асобы падтрымкі "ў ADO.NET 3.0 і прыняцця Java Persistence API ў якасці замены для EJB Entity Beans і JDO, здавалася, час, каб зрабіць менавіта гэта.)
Не ўзброеным канфліктам у гісторыі ЗША перасьледуе амерыканскіх ваенных больш чым на $ G (В'етнам). Так шмат разбежных элементы аб'ядналіся, каб стварыць найбольш вырашальным паваротным момантам у сучаснай амерыканскай гісторыі, што яна не паддаецца спробе любога непрафесіяналы дражніць іх адзін ад аднаго. І тым не менш, гісторыя В'етнама прынцыпова простая: Злучаныя Штаты пачалі ваенную праект з простым, але незразумела і супярэчаць адзін аднаму мэты, і хутка стаў заблыталася ў дрыгве, што не толькі збіў дзвюх краін (па адным законе, адзін праз сілу зброі), але і глыбока шнарамі амерыканскай ваеннай дактрыны на працягу наступных чатырох дзесяцігоддзяў (па крайняй меры).
Хоць гэта можа здацца банальным сказаць, што гэта, $ G (Object / Relational Mapping) з'яўляецца В'етнам інфарматыкі. Яна ўяўляе сабой балота, якое пачынаецца так, становіцца больш складаным з цягам часу, і неўзабаве захоплівае яго карыстальнікаў у абавязацельства, што не мае дакладнай пункту дэмаркацыі, няма дакладных умоў перамогі, і няма выразнай стратэгіі выхаду.
Гісторыя
PBS мае добры агляд вайны, але для тых, хто больш зацікаўлены ў галіне камп'ютэрных навук, чым палітычная / Гісторыя ваеннага, кароткая версія выглядае наступным чынам:
$ G (Паўднёвая Індакітая), цяпер вядомы як В'етнам, Тайланд, Лаос і Камбоджа, мае доўгую гісторыю барацьбы за аўтаномію. Да французскага каланіяльнага панавання (які пачаўся ў сярэдзіне 1800-х гадоў), Паўднёвая Індакітаі змагаўся рэгіянальнага незалежнасць ад Кітая. Падчас Другой сусветнай вайны, японскія заваяваў вобласці, толькі каб быць пазней "вызваленых" ад саюзнікаў, якія вядуць Францыі аднавіць сваё каланіяльнае кіраванне (як гэта зрабілі ангельцы ў сваіх каланіяльных тэрыторый у іншых краінах Азіі і Індыі). Пасля Другой сусветнай вайны, аднак, народ Паўднёвай Індакітаі, скінуўшы адзін прыгнятальніка, пашырылі свае супраць акупацыі намаганні па барацьбе з французскім, а не японскі, а ў 1954 годзе французскі капітулявала, падпісаўшы $ G (Жэнева мірных пагадненняў) афіцыйна грант В'етнаме сваю незалежнасць. На жаль, глабальнае ціск перакручаныя намаганні некалькі, і замест трывалага мірнага пагаднення часовае рашэнне было створана, падзяліўшы народ на 17-й паралелі, стварэння дзвюх дзяржаў, у якіх раней не існавала такога дзялення. Выбары павінны былі адбыцца ў 1956 годзе для ўз'яднання краіны, але ЗША асцерагаліся, што занадта шмат ўлады будзе нададзена $ G (Камуністычнай партыі В'етнама) праз гэтыя выбары, і замест падтрымаў контр-камуністычнае дзяржава на поўдзень ад 17-й паралелі і сфармаваў шэраг шматбаковых пагадненняў вакол яго, напрыклад, $ G (Сеат). Новая нацыя $ G (Паўднёвы В'етнам) нарадзіўся, і яго першай (сумнеўна) абраны лідэр $ G (НДА Дзінь Diem), устойліва анты-камуніст, які амаль адразу ж заявіў аб сваёй краіне пад камуністычным атакі. $ G (Эйзенхауэра) працягваюць аказваць падтрымку ўраду Diem, але лаяльнасць Diem з народам было практычна адсутнічае з самага пачатку.
Да таго часу $ G ЗША ад Дэмакратычнай партыі (John F Kennedy) прыйшоў у Белы дом, рэчы прыходзілі ў галаву ў Паўднёвым В'етнаме. Кэнэдзі накіраваў каманды ў В'етнам, каб даследаванні умоў там і дапамагчы сфармуляваць сваю стратэгію па гэтым пытанні. У тое, што цяпер вядома як "$ G (снежань 1961 года Белая кніга)", аргумент на карысць павелічэння ў ваенна-тэхнічнай і эканамічнай дапамогі быў прадстаўлены, нараўне з буйнымі амерыканскіх "дарадцаў", каб дапамагчы стабілізаваць ўрад Diem і ліквідацыі $ G (Фронт нацыянальнага вызвалення), названы $ G (Вьетконг) ЗША. Што не так шырока вядома, аднак, з'яўляецца тое, што колькасць дарадцаў Кэнэдзі сцвярджаў, што ў дачыненні да назапашвання, называючы В'етнаме "тупіковы завулак".
Сутыкнуўшыся з двума дыяметральна супрацьлеглымі шляхамі, Кэнэдзі, як гэта было характэрна для яго адміністрацыі, выбраў сярэдні шлях: замест альбо масіўныя абавязацельствы ці поўнага вываду, Кэнэдзі, а не вырашылі шукаць абмежаванай ўрэгулявання, адпраўка дапамогі, але не вялікая колькасць войскаў, шлях, які быў амаль асуджаны з самага пачатку. Праз шэраг стратэгічных памылак, у тым ліку прымусовае перасяленне сельскіх жыхароў (вядомы як $ G (Стратэгічны Гамлет праграмы)), падтрымка Diem быў настолькі глыбока эродированных, што Кэнэдзі нерашуча і запінаючыся падтрымлівае пераварот, падчас якой быў забіты Diem. Тры тыдні праз, Кэнэдзі быў забіты таксама, кідаючы ўнутраных амерыканскай палітычнай сцэне ў беспарадкі, а таксама. Па іроніі лёсу, канфлікт пачаўся Кэнэдзі будзе на самой справе пазней быць звязаныя найбольш цесна з яго замены.
Джонсана вайны
На момант забойства Кэнэдзі, В'етнам 16000 амерыканскіх саветнікаў на месцы, большасць з якіх не ўдзельнічаюць у штодзённых баявых дзеянняў. Кэнэдзі віцэ-прэзідэнт і новая замена, аднак, $ G (Ліндан Бейнс Джонсан), не быў перакананы, што гэты шлях вядзе да поспеху, і прыйшлі да пераканання, што больш агрэсіўнае дзеянне было неабходна. Скарыстаўшыся сумніўнага інцыдэнту, у якім в'етнамскага патрульных катэры напалі амерыканскія эсмінцы 1 у $ G (Тонкинском заліве), Джонсан выкарыстоўвалі пра-ваеннай настрояў у Кангрэс прыняць рэзалюцыю, якая дала яму паўнамоцтвы па вядзенню ваенных дзеянняў без яўнага аб'явы вайны. Прасцей кажучы, Джонсан хацеў весці гэтую вайну "ў халоднай крыві": "Гэта азначала, што Амэрыка пойдзе на вайну ў В'етнаме з дакладнасцю хірурга з невялікім прыкметны ўплыў на ўнутраную культуру абмежаванай вайны заклікаў да абмежаваным мабілізацыі. рэсурсаў, матэрыяльных і чалавечых, і выклікаў невялікі збой у паўсядзённым жыцці ў Амерыцы. " ( крыніца ) У сутнасці, гэта было б вайны, чыя адзіная ўплыў будзе адчувацца В'етнамская - амерыканскай жыцця і грамадства будзе працягвацца без якіх-небудзь паведамлення аб падзеях ва В'етнаме, у выніку чаго Джонсан працягваць яго першая вялікая любоў, яго " Вялікае таварыства ", нацыянальнай парадку дня прызначаныя для мацавання многія бяды таварыства ЗША, такіх як беднасць 2. Гісторыя, вядома, ведае лепш, і - магчыма, жорстка - званкі канфлікту ў В'етнаме "Вайна Джонсана".
Першапачаткова варта адзначыць, што В'етнам-як-катастрофа апошніх ўспрымання; апытаных амерыканцаў як у канцы 1967 былі перакананыя, што вайна была добрая рэч, што камунізм трэба быць спынены, і што В'етнам, яна павінна падаць, будзе першы з серыі Нацый паддавацца камуністычнай падрыўной дзейнасці. Гэта "$ G (тэорыя даміно)" быў агульным рэфрэнам для амерыканскай палітыкі ў другой палове 20-га стагоддзя. Праблемы такога роду пакутуюць амерыканскай знешняй палітыкі з тых часоў камуністы паспяхова або амаль паспяхова падарваныя некалькі еўрапейскіх урадаў у працягу HTE другой палове 1940-х гадоў, а затым Кітай у 50-х гадоў. (Варта адзначыць, што Эйзенхаўэр і $ G (Джон Фостэр Далеса), распрацоўшчыкі з тэорыі, ніколі не ўключалі В'етнама ў іх кальцо даміно, якія павінны быць захаваны, а на самой справе Эйзенхаўэр быў дзіўна апатычным аб В'етнаме падчас некаторыя з яго сустрэч з Кэнэдзі падчас пераходу Белага дома.)
У 1968 годзе, аднак, вопыт В'етнама апынуўся значна, як Паўночнага В'етнама і Вьетконга пачаў $ G (Tet Offensive), кампаніі, якая ставіцца на ляжаць ўсе запэўненні амерыканскага ўрада, што перамога ў вайне ў В'етнаме. Па іроніі лёсу, як гэта было ў выпадку на працягу большай часткі вайны, NVA / VC сілы страцілі значную колькасць войскаў, значна больш, чым іх амерыканскія супернікі, але Tet Offensive шырока разглядаецца гісторыкамі будзе мяжы амерыканскіх будзе ў вайны. Пасля гэтага, грамадскае меркаванне апынулася на Джонсан, і ў драматычных прэс-канферэнцыі, ён абвясціў, што ён не будзе дамагацца перавыбрання. Акрамя таго, ён абвясціў, што ён будзе імкнуцца да ўрэгуляванні шляхам перамоваў з в'етнамскай.
Ніксана Promise
На жаль, амерыканская перамоўная пазіцыя была сур'ёзна аслаблена вельмі пратэсты, якія прывялі амерыканцаў за стол перамоваў, у першую чаргу, NVA / VC кіраўніцтва прызнала, што NVA / VC сіл, нягледзячы на ??ашаламляльныя ваенныя страты, што ледзь не зламаў іх (некалькі разоў), можа проста працягваць рабіць, як яны рабілі, і адцісніце саступак ад амерыканцаў, не прапанаваўшы ніякіх наўзамен. Бег на платформе, якая складалася ў асноўным з абяцанне "Атрымаць Амерыкі з В'етнама", пераемнік Джонсана, Рэспубліканскі $ G (Richard Nixon), спрабаваў некалькі тактык для аказання ціску на NVA / VC сіл гандлявацца, уключаючы пашырэнне паветра барацьбе прысутнасці (напрыклад, $ G (Каляды выбухаў) і $ G (меню кіравання)) і рэгулярныя парушэнні бліжэйшых Лаоса і Камбоджы, праводзячы лінію паставак з Паўночнага В'етнама ў клеткі ў Паўднёвым В'етнаме. Нічога не працавала, аднак, і ў адміністрацыі Ніксана 1973 падпісаны $ G (Парыжскае мірнае пагадненне), канчатак амерыканскага ўдзелу ў гэтым канфлікце. Два гады праз, Паўднёвы В'етнам быў перарасход, а 30 красавіка 1975 года, Камуністычная войскі захапілі Сайгон, сталіца В'етнама, прымушаючы эвакуацыі амерыканскай амбасады і найбольш запамінальны вобраз вайны, што патокаў уцекачоў людзей, якія шукаюць месца на верталёт Huey ўзгрувасціўся на дах амбасады.
Вайна's End
Другі Паўднёвай В'етнамскай вайны быў скончаны, Амерыкі адбылося самае глыбокае паражэнне за ўсю сваю гісторыю, і В'етнам стаў сінонімам "балота". Яго ўплыў на амерыканскую культуру было вымераць, як ён навучыў цэлае пакаленне амерыканцаў страх і недавер ўрада іх, ён вучыў амерыканскіх лідэраў баяцца любую колькасць амерыканскіх ваенных страт, і прывёў фразу "дакладную стратэгію выхаду" непасрэдна ў амерыканскай палітычнай лексікон. Не да $ G (Ronald Reagan), выкарыстоўваныя амерыканскімі вайскоўцамі "вызваліць" малое астраўная дзяржава ў $ G (Грэнада) будзе амерыканскай ваеннай інтэрвенцыі лічыць магчымым інструментам дыпламатыі амерыканскіх прэзідэнтаў, ды і то толькі з вялікай адчувальнасцю да унутраным заклапочанасць, паколькі $ G (Біл Клінтан) будзе даведацца падчас яго місіі па падтрыманні міру ў $ G (Самалі) і $ G (Косава). У колькасных паказчыках, таксама эфекты В'етнама відавочна не апраўдалі мэты Джонсана вайны ў "халоднай крыві". Канчатковы падлік: 3 мільёны амерыканцаў служыў у вайну, 150000 цяжка паранены, 58000 мёртвых, і больш за 1000 МУС, не кажучы ўжо каля мільёна NVA / Вьетконга войскаў ахвяр, 250000 южновьетнамских ахвяры, і сотні тысяч - калі не мільёны, так як некаторыя гісторыкі выступалі - ахвяраў сярод грамадзянскага насельніцтва.
Урокі В'етнама
В'етнам уяўляе цікавую задачу, каб студэнт ваеннай і палітычнай гісторыі - менавіта тое, што пайшло не так, калі і дзе? Відавочна, што нежаданне ўрада ЗША прызнаць яго няўдач у ходзе вайны робіць для лёгкай казла адпушчэння, але ні адно ўрад у гісторыі сучаснага грамадства ніколі не былі цалкам праўдзівыя з насельніцтвам аб сваёй лёсу вайны, адзін такі прыклад ўключае ў сябе (але не абмяжоўваючыся) асцярожным цэнзуры ж урад ЗША аб дзейнасці падчас Другой сусветнай вайны, пяцьдзесят гадоў таму, вядомы ў амерыканскай гісторыі як "апошнюю вайну" добра "". Таксама павабна, каб паказаць на адсутнасць ваеннай мэты, як важна адсутнасці кропка В'етнама, але і іншыя неваеннага мэты былі паспяхова выкананы па ЗША і іншых краін без выгляд каласальнага правалу суправаджаючых гісторыю В'етнама. Акрамя таго, важна адзначыць, што ЗША і на самай справе, ёсць выразная мэта ў тым, што яна хацела з канфлікту ў Паўднёвай Індакітай: каб спыніць падзенне ўрада Паўднёвага В'етнама, і, хіба што, спыненне " распаўсюджвання "камунізму. Ці было гэта нежаданнем ўрада ЗША для развязвання вайскоўцаў на поўную катушку магчымасці, а $ G (Генерал Уільям Уэстморленд) заўсёды запатрабаваныя? Вядома, няўдачы ў В'етнаме была не ваенная, колькасць ахвяр ясна, што ЗША, на любыя іншыя меры, было ясна перамогу.
Так што ж было галоўным няўдач ў В'етнаме? І, што больш важна, што ўсё гэта мае дачыненне да O / R карт?
В'етнам і O / R адлюстраванне
У выпадку В'етнама, палітычныя і ваенныя ЗША апарат сутыкнуўся з смяротная форма $ G (Закон Вяртае Памяншэнне). У выпадку аўтаматызаванага Object / Relational Mapping, гэта ж заклапочанасць, - што першыя поспехі даюць абавязацельства выкарыстоўваць O / RM ў месцах, дзе поспех становіцца значна больш складаным, і з цягам часу, не поспех на ўсіх з-за накладных расходаў часу і энергіі, неабходнай для падтрымкі яго праз усе магчымыя сцэнарыі выкарыстання. У сутнасці, самы вялікі ўрок В'етнама - для любой групы, палітычных ці інакш - гэта ведаць, калі на "доўгі скрыню і працаваць", як рыбакі кажуць. Занадта часта, як гэта было ў В'етнаме, лёгка, каб апраўдаць далейшыя інвестыцыі ў пэўны кірунак дзеянняў здагадку, што адмова ад гэтага курса як-то несапраўднымі ўсе працы - або, у выпадку, В'етнама, жыцці амерыканскіх салдат, - што ўжо былі выплачаныя. Такія фразы, як "Мы зайшлі так далёка, вядома, мы можам бачыць гэтую справу да канца" і "адступаць зараз выкідваць усё, што мы ахвяравалі аж да гэтага моманту" сталі звычайнай з'явай. Па крайняй меры, падчас пазней, глыбока горкія гады другой палове В'етнама, пытанні патрыятызму ўступіў у пытанне: калі вы не падтрымлівае вайну, вы былі дакладна здраднік, камуніст, відавочна, "unAmerican", непаважлівае ўсіх амерыканскіх ветэранаў любой вайны ваяваў на любы глебе, па якой прычыне, і вы, верагодна, нагамі ваша сабака ў прыдачу. (Гэта не дапамагло прычынай мітынгоўцаў, што яны абвінавацілі салдат для вайны, іх падсправаздачнасці - часам асабіста - для вырашэння ваенных і палітычных лідэраў, большасць з якіх ні салдат, ні пратэстуючых калі-небудзь сустракаў.)
Прызнаючы, што ўсе аналогіі няўдача ў канчатковым выніку, і што пытанне аб В'етнаме глыбей, чым гэта эсэ можна вывучыць, Ёсць яшчэ ўрокі тут, у зусім іншы арэне. Адзін з ключавых урокаў В'етнама была небяспека таго, што гутаркова называюць "слізкі шлях": што дадзенае напрамак дзейнасці можа прынесці некаторыя раннія поспехі, яшчэ дадатковыя інвестыцыі ў гэтую дзеянняў дае ўсё меней супамерныя вынікі і increasibly небяспечныя перашкоды, адзіным вырашэннем ўяўляецца будзе ўсё больш і больш вылучэння рэсурсаў і / або дзеянняў. Некаторыя называюць гэта "наркотыкі Пастка", пасля спосабу фармацэўтыцы (легальнай ці нелегальнай) можа мець эфект памяншаецца пры працяглым выкарыстанні, патрабуе павялічыў дазоўку ў мэтах даюць аднолькавыя вынікі. Іншыя называюць гэта "Апошняя міля" Праблема ": што як адзін набліжаецца да канца праблемы, становіцца ўсё цяжэй ў вартасным выражэнні (як грашовыя, так і абстрактныя), каб знайсці 100% поўнага рашэнні. Усе яны ў асноўным казаць пра тое ж - цяжкасці з пошукам адказу, што дазваляе нашаму герою "прыкончыць" праблемы ў пытанні, цалкам і здавальняюча.
Мы пачынаем аналіз Object / Relational Mapping - і яе сувязь з Паўднёвай Другі В'етнамскай вайны - шляхам вывучэння прычын для гэтага ў першую чаргу. Што прымушае распрацоўнікаў ад выкарыстання традыцыйных рэляцыйных прылады для доступу да рэляцыйнай базе дадзеных, і аддаюць перавагу замест гэтага інструменты, такія як S O / R-М "?
Аб'ектна-рэляцыйнай неадпаведнасці
Сказаць, што аб'екты і рэляцыйных набораў дадзеных так ці інакш пабудаваныя па-рознаму, як правіла, не сюрпрыз для любога распрацоўніка, які калі-небудзь выкарыстоўвалі як, за выключэньнем вельмі спрошчаным сітуацыі, ён становіцца досыць відавочна прызнаць, што шлях, у якім рэляцыйнае сховішча дадзеных прызначана тонка - І тым не менш глыбока - розныя, чым як аб'ект сістэма прызначаная.
Аб'ект сістэмы, як правіла, характарызуецца чатырох асноўных кампанентаў: асоба, стан, паводзіны і інкапсуляцыі. Ідэнтычнасць няяўных канцэпцыі ў большасці моў О.О., у тым, што дадзены аб'ект мае унікальны ідэнтыфікатар, які адрозніваецца ад яго стану (неадназначнасьць ўнутранага поля) - два аб'екта з таго ж дзяржавы па-ранейшаму самастойнымі і асобнымі аб'ектамі, нягледзячы на ??тое, біт-у-біт люстэркі адзін ад аднаго. Гэта "асоба супраць эквівалентнасці" абмеркаванне, якое адбываецца ў мовах, як C + +, C # або Java, дзе распрацоўшчыкі павінны праводзіць адрозненне паміж "== б" і "a.equals (б)". Паводзіны аб'екта досыць лёгка бачыць, набор аперацый кліенты могуць спасылацца маніпуляваць, вывучаць, ці ўзаемадзейнічаць з аб'ектамі ў некаторым родзе. (Гэта тое, што адрознівае аб'екты ад пасіўных структур дадзеных у працэдурны мова, як C) Інкапсуляцыя з'яўляецца адным з ключавых дэталяў, прадухілення знешніх бакоў ад маніпулявання ўнутраныя дэталі аб'екта, забяспечваючы тым самым эвалюцыйны магчымасці аб'екта інтэрфейс для кліентаў. 3. З гэтага мы можам атрымаць больш цікавыя канцэпцыі, такія як тып, афіцыйную заяву аб стане аб'екта і паводзінаў, асацыяцыі, якія дазваляюць тыпаў для спасылкі адзін з адным праз лёгкія спасылцы, а не поўнае па значэнні уласнасці (часам называецца кампазіцыя), атрыманне ў спадчыну, здольнасць звязаць аднаго тыпу ў другі, што, датычныя тыпу ўключае ў сябе ўсе звязаныя тыпу стану і паводзінаў у рамках сваёй уласнай, і палімарфізм, магчымасць замяніць аб'ект, дзе іншы тып не чакаецца.
Рэляцыйныя сістэмы ўяўляюць сабой форму захоўвання і здабывання ведаў на аснове логікі предикатов і праўды заявамі. У сутнасці, кожная радок у табліцы дэкларацыі аб фактам у свеце, і SQL дазваляе аператару эфектыўна вымання дадзеных з гэтых фактаў з выкарыстаннем логікі предикатов для стварэння высновы з гэтых фактаў. [Date04] і [Фасселл] вызначаюць рэляцыйнай мадэлі як характарызуецца стаўленне, атрыбут, картэж, значэнне адносіны і адносіны зменнай. Суадносіны, у яго сэрца, предикат ісціны аб міры, канстатацыя фактаў (атрыбуты), якія забяспечваюць значэнне предиката. Напрыклад, мы можам вызначыць стаўленне "твар", як {SSN, імя, горад}, у якім гаворыцца, што "існуе чалавек з нумара сацыяльнага страхавання SSN, які жыве ў горадзе і назва". Адзначым, што ў стаўленне, атрыбут замовы цалкам вызначана. Картэж ісціны заяву ў кантэксце адносін, мноства значэнняў атрыбутаў, якія адпавядаюць неабходным наборам атрыбутаў у адносінах, напрыклад, "{ЧАЛАВЕК SSN = '123-45-6789 'Name =' Кэнэдзі 'Горад Кацярыны = "Сіэтл"} ". Адзначым, што два набору лічацца ідэнтычнымі, калі іх сувязь і значэнняў атрыбутаў таксама ідэнтычныя. Значэнне адносіны, то гэта спалучэнне адносіны і мноства картэжаў, якія адпавядаюць, што суадносіны, а суадносіны зменнай, як і большасць зменных, запаўняльніка для дадзенага адносіны, але можа змяняць сваё значэнне з цягам часу. Такім чынам, зменная Людзі суадносіны можна запісаць правесці стаўленне {} ЧАЛАВЕК, і складаюцца з значэнне адносіны
{ {PERSON SSN='123-45-6789' Name='Catherine Kennedy' City='Seattle'},
{PERSON SSN='321-54-9876' Name='Charlotte Neward' City='Redmond'},
{PERSON SSN='213-45-6978' Name='Cathi Gero' City='Redmond'} }
Гэта звычайна згадваецца як табліцы (суадносіны зменнай), радкоў (картэжаў), калоны (атрыбуты), і калекцыя зменных адносін як базы дадзеных. Гэтыя асноўныя тыпы элементаў могуць быць аб'яднаныя адзін з адным з дапамогай набору аператараў (апісана больш падрабязна ў раздзеле 7 [Date04]): абмежаваць, праекта, прадукту, далучыцца, дзялення, аб'яднанне, скрыжаванне і рознасць, і якія ляглі ў аснову ад фармату і падыходу да SQL, універсальна-прыняцце мова для ўзаемадзеяння з рэляцыйнай сістэмы ад аператара кансолі або моў праграмавання. Выкарыстанне гэтых аператараў дазваляе стварэнне вытворных значэння адносін, адносін, якія разлічваюцца з іншых значэння адносін у базе дадзеных - напрыклад, мы можам стварыць адносінах значэнне, якое паказвае колькасць людзей, якія жывуць у асобных гарадах, выкарыстоўваючы праекта і абмежаваць аператараў у дачыненні зменнай Людзі вызначана вышэй. Ужо цяпер гэта даволі ясна бачыць, што існуюць выразныя адрозненні паміж тым, як рэляцыйныя свету і аб'ект светапогляд "правільны" дызайн сістэмы, і больш будзе выяўляцца з цягам часу. Важна адзначыць, аднак, што да тых часоў, як праграмісты аддаюць перавагу выкарыстоўваць аб'ектна-арыентаваных моў праграмавання для доступу да рэляцыйныя сховішчаў дадзеных, заўсёды будзе нейкі аб'ектна-рэляцыйнага адлюстравання падзей, якія адбываюцца - дзве мадэлі проста занадта розныя, каб мост моўчкі. (Верагодна, тое ж самае адносіцца і аб'ектна-арыентаванага і працэдурнага праграмавання, але гэта яшчэ адзін аргумент на іншы дзень.) O / R адлюстравання можа мець месца ў розных формах, самы просты з якіх прызнаць гэта аўтаматызаваная O / R адлюстраванне інструмент, напрыклад, $ G (TopLink), $ G (Hibernate) / $ G (NHibernate), або $ G (Gentle.NET). Іншай формай адлюстравання ручнога кадавання аднаго, у якім праграмісты выкарыстоўваюць рэляцыйныя-арыентаваных інструментаў, такіх як JDBC або ADO.NET, для доступу да рэляцыйныя дадзеных і распакуйце яго ў форму, больш прыемным для аб'ектна-аднадумцаў распрацоўшчыкаў "ад рукі". Трэці проста прыняць форму рэляцыйнымі дадзенымі ў выглядзе "" мадэлі, з якіх у эксплуатацыі, і раб аб'ектаў вакол яго, каб гэты падыход, гэта таксама вядома ў структуры лексікі як Table Data Gateway [PEAA, 144] або Row Data Gateway [PEAA 152], многія пласты доступу да дадзеных як у Java і NET выкарыстоўваць гэты падыход і аб'яднаць яго з кодам пакалення для хуткага стварэння гэтага пласта.. Часам мы будуем аб'екты вакол рэляцыйнай / настольная мадэль, паставіць некаторыя дадатковыя паводзіны вакол яго, і называюць гэта Active Record [PEAA, 160].
Па праўдзе кажучы, гэта асноўны падыход - на падпарадкаваныя адной мадэлі ў тэрмінах і падыход іншы - быў традыцыйны адказ на неадпаведнасці, эфектыўна "рашэнні" праблемы, ігнаруючы палову яго. На жаль, большасць намаганняў у галіне развіцця, як і Кэнэдзі, не хочуць бачыць гэта да лагічнага завяршэння з аптовым прыхільнасць аднаго падыходу над іншым. Напрыклад, у той час як большасць каманд развіцця былі б шчаслівыя прыняць "аб'екты-толькі" падыход, робяць гэта на ўзроўні захоўвання мяркуе выкарыстанне аб'ектна-арыентаванага сістэмы кіравання базамі дадзеных (ООСУБД), тэма, якая часта не мае цягу ў вышэйшае кіраўніцтва ці карпаратыўныя каманды кіравання дадзенымі. Супрацьлеглы падыход - "рэляцыйных толькі" падыход - гэта амаль бессэнсоўна разглядаць, улічваючы тэхналогію дзень у той час гэта было напісана 4.
Улічваючы, што гэта немагчыма, то, каб "развязаць аб'ектаў у іх самым поўным магчымасцяў", як генеральны Уэстморленд маглі б назваць гэта, у нас застаецца нейкі гібрыднай аб'ектна-рэляцыйнага адлюстравання падыход, пажадана той, які аўтаматызаваных як мага больш, так што распрацоўшчыкі могуць засяродзіцца на сваёй мадэлі прадметнай вобласці, а не на дэталі аб'ект-табліца (ы) адлюстраванне. І тут, на жаль, дзе патэнцыйным балота пачынаецца.
Праблема аб'ект-табліца карт
Адзін з першых і найбольш лёгка пазнавальныя праблемы з выкарыстаннем аб'ектаў, як інтэрфейс да рэляцыйныя сховішчам даных з'яўляецца тое, што пра тое, як карта класаў да табліцах. На першы, здаецца, даволі проста практыкаванне - табліцы карце тыпаў слупкоў для палёў. Нават тыпаў палёў па ўсёй бачнасці, выстройваюцца непасрэдна супраць рэляцыйных тыпаў слупкоў, па меншай меры, досыць ізаморфныя ступень: тыпу VARCHAR, каб радкі, цэлыя лікі ў цэлыя, і так далей. Таму мае сэнс, што для любога дадзенага класа, вызначанага ў сістэме, адпаведнай табліцы - верагодна, будуць мець аднолькавыя ці блізкія імя - вызначаецца пайсці з ім. Ці, можа быць, калі аб'ектны код пішацца на ўжо існуючую схему, то клас карты на стол.
Але з цягам часу, гэта натуральна, што добра падрыхтаваныя аб'ектна-арыентаваных распрацоўнікаў будзе імкнуцца выкарыстоўваць спадчыну ў аб'ектнай сістэмы, і шукаць спосабы зрабіць тое ж самае ў рэляцыйнай мадэлі. На жаль, рэляцыйная мадэль не падтрымлівае якую-небудзь палімарфізму або IS-роды адносіны, і таму распрацоўнікі ў канчатковым выніку аказваюцца прыняцця аднаго з трох магчымых варыянтаў карту спадчыну ў рэляцыйных свеце: табліца на клас, табліца на канкрэтна-клас, або табліца на клас-сям'і. Кожны з іх нясе патэнцыйна істотных недахопаў.
Табліца на класавы падыход, мабыць, самая простая для разумення, бо яно імкнецца звесці да мінімуму "адлегласьць" паміж аб'ектнай мадэлі і рэляцыйнай мадэлі, кожны клас у іерархіі спадчыну атрымлівае сваю ўласную рэляцыйныя табліцу, і аб'екты вытворных тыпаў сшылі з рэляцыйных JOIN і праз розныя спадчыну аснове табліц. Так, напрыклад, калі аб'ект мадэлі базавага класа Person, са Студэнцкім вытворны ад асобы і GraduateState вытворным ад студэнта, то там будзе тры табліцы, неабходныя для правядзення гэтай мадэлі, чалавек, студэнт, і GraduateStudent, кожная з якіх утрымоўвае поля, якія адпавядаюць для класа з аднайменнай назвай. Злучаюць гэтыя табліцы разам, аднак, патрабуе ад кожнага мець незалежны першасны ключ (адно, значэнне якога ў рэчаіснасці не захоўваецца ў аб'екце асобы), так што кожны вытворны клас можа мець знешні ключ адносінах да табліцы яго суперкласса. Прычына гэтага ясная: аб'ект GraduateStudent, у сілу сваёй IS-адносіны да вучня і чалавека, з'яўляецца сукупнасць усіх трох набораў дзяржавы, і адрозненні паміж класамі ў асноўным выдаленыя час аб'ект гэтага тыпу ствараецца -. як у Java і NET, напрыклад, сам аб'ект кавалак памяці, які ўтрымлівае асобнік палёў, вызначаных ва ўсіх яе класаў і суперклассов, а таксама паказальнік на табліцу метадаў, вызначаных у тым жа іерархіі. Гэта азначае, што пры запыце канкрэтнага асобніка на рэляцыйнай узроўні, па крайняй меры тры JOIN і павінна быць зроблена ў мэтах прывядзення ўсіх дзяржаўных аб'ектаў у рабочай памяці аб'ект праграмы.
На самай справе, гэта яшчэ горш, чым - калі іерархіі аб'ектаў працягвае расці, кажуць ўключыць прафесар, Персанал, Агульнае (успадкоўваецца ад студэнта), і цэлая іерархія AdjunctEmployees (спадчыну па плана), і праграма хоча, каб знайсці ўсё Асобы, прозвішча Сміт, пасля чаго далучаецца павінна быць зроблена для кожнага вытворнага класа ў сістэме, так як семантыка "знайсці ўсіх асоб" азначае, што запыт павінен шукаць дадзеныя на стол чалавека, а затым рабіць дарагія мноства далучаецца да прывесці ў астатнія дадзеныя па ўсім астатнія базы дадзеных, пацягнуўшы ў Прафесар табліцы для вымання астатніх даных, не кажучы ўжо старшакурснік, ADJUCTEMPLOYEE, супрацоўнікаў і іншых табліц. Улічваючы, што злучэння з'яўляюцца аднымі з самых дарагіх у выразах запытаў СКБД, гэта відавочна не тое, каб правесці злёгку.
У выніку, распрацоўшчыкі звычайна прымаюць адну з двух іншых падыходаў, больш складаныя ў Outlook, але больш эфектыўным пры рабоце з рэляцыйнымі захоўвання: яны альбо стварыць табліца на канкрэтны (найбольш паходжання) класа, аддаючы перавагу, каб прыняць денормализации і яго кошту, або інакш яны ствараюць адну табліцу для ўсёй іерархіі, часта ў любым выпадку стварэнне дыскрымінатара калонку, каб пазначыць, да якога класа кожнага радка ў табліцы належыць. (Розныя гібрыды гэтых схем таксама магчымыя, але, як правіла, не стварае вынікі, якія значна адрозніваюцца ад гэтых двух.) На жаль, денормализации выдаткі часта значныя для вялікіх аб'ёмаў дадзеных, і / або табліц (ы) будзе ўтрымоўваюць значная колькасць пустых слупкоў, якія неабходна значэнне NULL абмежаванні на ўсе слупкі, ухіляючы магутныя абмежаванні цэласнасці, прапанаваныя СКБД.
Успадкоўванне адлюстраванне не ў канцы яго; асацыяцыі паміж аб'ектамі, тыповымі 1: N ці M: N магутнасці асацыяцый так шырока выкарыстоўваецца як у SQL і / або UML, апрацоўваюцца зусім па-рознаму: у аб'ект сістэмы, асацыяцыі з'яўляецца однонаправленным, ад ассоциатор да associatee (гэта значыць звязаны аб'ект (ы) паняцця не маю, яны на самой справе звязаныя, калі відавочныя двунаправленной асацыяцыі усталёўваецца), у той час як у рэляцыйных сістэмах асацыяцыі фактычна назад, ад associatee да ассоциатор (праз знешні ключ слупкоў). Гэта аказваецца дзіўна важна, бо гэта азначае, што для M: N аб'яднанняў, трэцяя табліца павінна быць выкарыстана для захоўвання фактычных адносін паміж ассоциатор і associatee, і нават для простай 1: N адносіны ассоциатор не мае уласцівых веды адносін, да якіх яна Associates - выяўляюць, што дадзеныя патрабуе злучэння з любой ці ўсё звязаныя табліцы ў некаторай пункце. (Калі на самой справе атрымання гэтых даных з'яўляецца прадметам некаторага абмеркавання - гл Загрузка Paradox, ніжэй).
Схема-уласнасці канфліктаў
Абмеркавання ў спадчыну да стала і схемы асацыяцыі адлюстраванне таксама раскрывае асноўныя недахоп: У глыбіні душы, многія аб'ектна-рэляцыйнай інструменты адлюстравання лічыць, што схемы з'яўляецца тое, што можа быць вызначана па схемах, якія дапамагаюць аптымізаваць O / запытаў RM гэта супраць рэляцыйнай дадзеных. Але гэта супярэчыць асноўнай праблемай, якая часта схемы сама база дадзеных не знаходзіцца пад прамым кантролем распрацоўшчыкаў, але замест належыць іншай групе ўнутры кампаніі, як правіла, адміністраванне баз дадзеных (DBA) групы. Каму адказнасць за распрацоўку базы дадзеных - і вырашыць, калі змены схемы дапушчальныя - належаць?
У многіх выпадках распрацоўшчыкі пачынаюць новы праект з "чыстага ліста", пусты рэляцыйная база дадзеных, схема якога належыць ім, каб вызначыць, як яны лічаць патрэбным. Але, неўзабаве пасля праекта было адгружана (часам нават раней, у сувязі з палітычнай і / ці "барацьбе за сферы ўплыву" пытанняў), становіцца відавочным, што права ўласнасці распрацоўшчыкаў схемы часова ў лепшым выпадку - розныя дэпартаменты пачынаюць якія патрабуюць справаздач у базе даных, адміністратараў баз дадзеных былі прыцягнутыя да адказнасці ў сувязі з выкананнем базы дадзеных тым самым даючы ім прычыны заклікаць да "рэарганізацыі" і денормализации дадзеных, і іншыя каманды распрацоўшчыкаў можа пачаць запытальна аб тым, як яны могуць выкарыстоўваць дадзеныя, якія захоўваюцца ў ім. У хуткім часе, схема павінна быць "замарожанымі", што патэнцыйна стварае бар'ер для аб'ектнай мадэлі рэфактарынгу (гл. Злучэнне канцэрна, ніжэй). Акрамя таго, гэтыя іншыя каманды будуць чакаць рэляцыйнай мадэлі вызначаны ў рэляцыйных тэрмінах, а не той, які падтрымлівае цалкам артаганальнай формы захавання - напрыклад, "дыскрымінатара" калонкі ад спадчыну да стала задача аб адлюстраванні будзе прадстаўляць цяжкасцяў, і, магчыма, усё, але непрыдатныя для рэляцыйных генератараў справаздач, такіх як Crystal Reports. Калі распрацоўшчыкі гатовыя напісаць усе справаздачы (і іх інтэрфейсы, і іх друку код, і іх спецыяльныя магчымасьці...) уручную, звычайна гэта будзе непрымальна становішча спраў.
(Справядлівасці дзеля варта адзначыць, гэта не столькі тэхнічная праблема, бо гэта палітычная праблема, але яна па-ранейшаму ўяўляе сур'ёзную праблему, незалежна ад яе крыніцы -. Або рашэнне і, як такая, яна ўсё яшчэ ўяўляе перашкода для аб'ектна-рэляцыйнага адлюстраванне рашэнне.)
Dual-схема Праблема
Звязаны з гэтым пытанне да пытання аб уласнасці схемы з'яўляецца тое, што ў O / RM рашэнне, метададзеныя сістэмы праводзіцца прынцыпова ў двух розных месцах: адзін раз у схему базы дадзеных, і адзін раз у аб'ектнай мадэлі (іншай схеме, калі вы будзеце, выяўлены ў Java або C # замест DDL). Абнаўленне або рэфактарынгу аднаму, верагодна, запатрабуе абнаўлення або аналагічных рэфактарынгу да аднаго. Рэфактарынгу кода, каб адпавядаць схеме базы дадзеных змяненняў з'яўляецца шырока лічыцца больш просты, - рэфактарынгу базы дадзеных часта патрабуе некаторага роду міграцыі і / або адаптацыі дадзеных, ужо ў базе даных, дзе код не мае такога патрабаванні. (Аб'екты, па крайняй меры ў гэтым абмеркаванні, эфемерныя ў памяці выпадкі, што знікне, як толькі працэс іх правядзення спыняецца, калі аб'екты захоўваюцца ў нейкі аб'ект формы, які можа захоўвацца для ўсіх працэс выканання -. Такіх як сериализованный аб'ект асобнікаў захоўваецца на дыску - то рэфактарынг аб'ектаў становіцца аднолькава праблематычна).
Што яшчэ больш важна, у той час гэта не рэдкасць для кода, які будзе разгорнуты спецыяльна для аднаго прыкладання, часта асобнікаў базы дадзеных выкарыстоўваюцца ў больш чым адна заяўка, і гэта часта непрымальна для бізнэсу, каб выклікаць у маштабе ўсёй кампаніі рэфактарынгу кода проста таму, што рэфактарынг на адным Дадатак патрабуе аналагічных базамі дадзеных рэфактарынгу. У выніку, як сістэмы расце з цягам часу, будзе ўсё большы ціск на распрацоўнікаў, каб "завязаць" аб'ектнай мадэлі з схемы базы дадзеных, такія, што змены схемы не запатрабуе падобны аб'ект мадэлі рэфактарынгу, і наадварот. У некаторых выпадках, дзе O / RM не дазваляе праводзіць такія адключэння, цалкам прыватная асобнік базы дадзеных, магчыма, давядзецца быць разгорнутыя, з дакладнай схемы O / RM-рашэнне на базе быў пабудаваны супраць стварэння яшчэ аднаго сіласу дадзеных у ІТ-сераду, дзе ціск патэнцыялу для скарачэння такіх бункераў.
Пытанні Entity Identity
Як калі б гэтыя праблемы былі не дастаткова, мы затым ісці ў іншую праблему, што асоба аб'ектаў і зносін. Як адзначалася вышэй, аб'ект сістэмы выкарыстоўваюць няяўна пачуццё ідэнтычнасці, як правіла, на аснове аб'екта месцы ў памяці (ўсюдыісны гэты паказальнік); Акрамя таго, гэта часам называюць OID (Object Identifier), як правіла, у сістэмах, якія не непасрэдна падвяргаць вочак памяці, такія як аб'ект базы дадзеных (дзе ў памяці паказальнік даволі бескарысным, так як ідэнтыфікатар за межамі базы дадзеных працэсу). У рэляцыйнай мадэлі, аднак, асоба маецца на ўвазе сама дзяржава - два шэрагу з дакладна такім жа стане, як правіла, разглядаюцца рэляцыйная пашкоджання дадзеных, як жа факт, сцвярджаў, двойчы з'яўляецца залішнім і контрпрадуктыўным. Каб быць справядлівым, мы павінны быць крыху больш відавочнай тут; рэляцыйная сістэма можа, на самай справе, дазволіць дубляваць набораў (як апісана вышэй), але гэта часта відавочна забароненыя відавочным рэляцыйныя абмежаванні, такія як першасныя сувязі KEY. У тых сітуацыях, калі паўтараюцца значэння дапускаюцца, няма ніякага спосабу для рэляцыйнай сістэмы, каб вызначыць, які з двух аднолькавых радкоў яго вымання - няма няяўна пачуццё ідэнтычнасці ў дачыненні да выключэннем таго, што прапанаваныя яго атрыбуты. Тое ж самае нельга сказаць аб сістэмах аб'ектаў, дзе два аб'екта, якія ўтрымліваюць менавіта ідэнтычных мадэляў біт у двух розных месцах памяці ў рэчаіснасці асобныя аб'екты. (Гэта прычына адрозненні паміж "==" і "роўная ()." У Java або C #.) Імплікацыі тут простая: калі дзве сістэмы збіраецца згаджацца на пачуццё ідэнтычнасці, рэляцыйная сістэма павінна прапануюць нейкі унікальнай канцэпцыі асобу (звычайна автоинкрементный цэлага слупкі), супадае з паняццем ідэнтыфікацыі аб'екта.
Гэта выклікае сур'ёзную заклапочанасць у дачыненні аўтаматызаванай O / R сістэмы, таму што пачуццё ідэнтычнасці зусім інакш - калі два асобных карыстацкіх сесій ўзаемадзейнічаць з тым жа стаўленнем у сховішча, паралелізм рэляцыйнай сістэмы баз дадзеных сістэм ўдар і пераканацца ў той ці іншай форме адначасовы доступ, як правіла, праз транзакцыйных метафара (кіслата). Калі O / R сістэма здабывае адносіны з захоўвання (у асноўным фарміраванне "Адкрыць" над дадзенымі), у нас зараз ёсць другі крыніца дадзеных асоба, адзін у базе дадзеных (абаронена вышэйзгаданых транзакцыйных схемы), і адзін у прадстаўленне ў памяці аб'ект, што дадзеныя, якія не мае паслядоўнай падтрымкі транзакцый ў баку ад гэтага ўбудаваны ў мову (напрыклад, маніторы канцэпцыі ў Java і. NET) або бібліятэкі (напрыклад, у System.Transactions. NET 2,0), альбо з якіх можа быць - і unfortuantely часта з'яўляюцца - проста ігнаруюцца распрацоўшчыкамі. Упраўленне ізаляцыі і паралелізму не лёгкая задача, каб вырашыць, і, на жаль моў і платформаў звычайна даступныя для распрацоўнікаў, яшчэ не гэтак паслядоўна або гнуткі, як метафара транзакцый базы дадзеных.
Што ўскладняе гэтую задачу далейшага тым, што многія O / R сістэмы ўвесці значную падтрымку кэшаваньня ў O / R пласта (як правіла, у спробе павысіць прадукцыйнасць і пазбегнуць зваротаў да базы дадзеных), а гэта, у сваю чаргу, уяўляе некаторыя праблемы, асабліва калі сістэма кэшаваньня не запісы праз кэш: калі фактычны "западліцо" з базай дадзеных адбываецца, і што гэта кажа аб цэласнасці транзакцый, калі код прыкладання лічыць, пісаць, мелі месца, калі на самай справе гэта не? Гэтая праблема, у сваю чаргу толькі злучэння, калі O / R сістэма працуе ў некалькіх працэсаў у пярэдняй часткі базы дадзеных, звычайна сустракаюцца ў кластарнай або гадуюцца сцэнарыяў сервера прыкладанняў. Зараз дадзеныя асобу распаўсюджваецца праз N 1 месцаў, N-колькасць серверных вузлоў прыкладанняў, а 1 самай базы дадзеных. Кожны вузел павінен як-то сігнал аб сваім намеры зрабіць абнаўленне на іншыя вузлы, каб атрымаць нейкі паралельнай пабудаваць для прадухілення адначасовага доступу (па іншай асобнік той жа сесіі, або экзэмпляр іншага сеансу доступу да тых жа дадзеных), што займае шмат часу, забіўшы прадукцыйнасці. Нават у выпадку толькі для чытання кэш, аднаўленьняў у сховішча дадзеных павінна быць як-то зразумець, каб кэш працуе ў вузлах сервера прыкладанняў, якія патрабуюць сервер-кліент сувязі паходзяць з базы дадзеных, падтрымка гэта не вельмі добра зразумеў ці дакументальна пацверджана ў цяперашняй плеяды сучасных рэляцыйных баз дадзеных.
Mechansim Аднаўленне даных канцэрна
Таму, як толькі аб'ект захоўваецца ў базе дадзеных, як менавіта мы можам атрымаць яго? Шчыра кажучы, чыста аб'ектна-арыентаваны падыход будзе выкарыстоўваць аб'ект падыходзіць для пошуку, у ідэале выкарыстоўваючы канструктар-сінтаксіс вызначэння аб'екта (аб'ектаў) жаданага, але, на жаль канструктар сінтаксіс не дастаткова агульнымі, каб за тое, што гнуткая, у прыватнасці, не хапае магчымасцяў для ініцыялізацыі калекцыі аб'ектаў, а таксама запыты часта неабходна для вяртання калекцыі, а не толькі аднаго асобы. (Некалькі зваротаў да базы дадзеных для вымання асоб індывідуальна, як правіла, лічыцца занадта марнатраўна, як затрымкі і прапускной здольнасці, каб разгледзець пераканаўча ў якасці альтэрнатывы -. Глядзіце час загрузкі Paradox, ніжэй, для больш) Як вынік, мы звычайна сканчаюцца з адным з запыту па ўзоры (QBE), Query-By-API (QBA), або запыту-К-Language (QBL) падыходаў.
QBE стану падыход, які вы запоўніце аб'екта шаблон тыпу аб'екта вы шукаеце, з палёў у аб'екце ўстаноўлена асаблівае значэнне для выкарыстання ў якасці часткі працэсу запыту-фільтрацыі. Так, напрыклад, калі вы запыту аб'екта твар / табліца для людзей з прозвішчам Сміт, вы стварылі запыт такім чынам:
Person p = new Person(); // assumes all fields are set to null by default p.LastName = "Smith"; ObjectCollection oc = QueryExecutor.execute(p);Праблема з QBE падыходу відавочная: у той час як гэта цалкам дастаткова для простых запытаў, гэта далёка не дастаткова выразны для падтрымкі больш складаных стылі запытаў, якія часта мы павінны выканаць - "знайсці ўсе асобы, названыя Сміт або Кромвель" і "знайсці ўсіх асоб, якія не імем Сміт "прыведзены два прыкладу. Хоць гэта не немагчыма пабудаваць QBE падыходаў, што справіцца з гэтым (і больш складаных сцэнараў), гэта вызначана абцяжарвае API значна. Больш таго, яна таксама прымушае аб'ектаў прадметнай вобласці ў нязручным становішчы - яны павінны падтрымліваць абнуляецца поля / ўласцівасці, якія могуць быць парушэнне правілаў вобласці аб'екта ў адваротным выпадку імкнуцца падтрымліваць - Чалавек без імя не Вельмі карысны прадмет, у многіх сцэнарах, але гэта менавіта тое, што QBE падыход запатрабуе даменных аб'ектаў, якія захоўваюцца ў ім. (Практыкуючыя QBE часта сцвярджаюць, што гэта не неабгрунтаваных для рэалізацыі аб'екта прыняць гэта да ўвагі, але зноў жа гэта не з'яўляецца ні лёгкім, ні часта робіцца.)
У выніку, як правіла, другі крок складаецца ў падтрымцы аб'ектаў сістэмы "запыт-па-API" падыход, пры якім запыты будуюцца па запыце аб'ектаў, звычайна што-то ў наступнай форме:
Query q = new Query();
q.From("PERSON").Where(
new EqualsCriteria("PERSON.LAST_NAME", "Smith"));
ObjectCollection oc = QueryExecutor.execute(q);
Тут, запыт заснаваны не на пустых "шаблон" аб'екта для яго загрузкі, але ад набору "запыту аб'ектаў", якія выкарыстоўваюцца разам, каб вызначыць камандна-аб'ект для выканання ў базе дадзеных. Некалькі умоў злучаюцца з дапамогай якой-то биномиальное пабудаваць, як правіла, "А" і "або" аб'ектаў, кожны з якіх утрымлівае унікальныя аб'екты крытэры для тэставання. Дадатковая фільтраванне / маніпуляцыі аб'ектамі могуць быць пазначаныя на канцы, як правіла, шляхам дадання выклікаў, напрыклад, "OrderBy (імя-поля)" або "GroupBy (поле-імя)". У некаторых выпадках, гэтыя выклікі метадаў на самай справе аб'екты, пабудаваныя на праграміста і злучаных разам у відавочным выглядзе. Распрацоўшчыкі хутка адзначыць, што вышэй падыход (у цэлым) значна больш падрабязна, чым традыцыйны падыход SQL, а пэўныя стылі запытаў (у прыватнасці, больш нетрадыцыйных аб'яднанняў, такіх як знешнія злучэння) значна складаней - калі не немагчыма - прадстаўляць у падыходзе QBA.
Акрамя гэтага, у нас ёсць больш тонкая праблема, што ў залежнасці ад дысцыпліны распрацоўнікаў: як імя табліцы ("твар") і імя слупкі ў крытэры ("PERSON.LAST_NAME") стандартныя радкі, узятыя ў -гэта і падаецца ў сістэме падчас выканання, не роду дзеяння праверкі да гэтага часу. Гэта ўяўляе сабой класічную праблему ў праграмаванні, што ад "тлушчу пальцаў" памылкі, калі распрацоўшчык не на самай справе запыт "твар" табліцы, але "PRESON" табліцы замест. Хоць хуткі блок-тэст супраць жывы асобнік базы дадзеных будзе выявіць памылкі падчас модульнага тэсціравання, гэта прадугледжвае два факту - што распрацоўшчыкі рэлігійнай аб прыняцці модульнага тэсціравання, і, што юніт-тэсты выконваюцца па базе дадзеных выпадках. Хоць былы паступова становіцца больш гарантый, як усё больш і больш распрацоўшчыкаў сталі "тэст-інфіцыраваным" (запазычанне гама і Beck's выбар тэрміналогіі), апошняя па-ранейшаму цалкам адкрыты для абмеркавання і інтэрпрэтацыі, у сувязі з тым, што стварэнне і разрыў ўніз асобніка базы дадзеных адпаведна для юніт-тэстаў па-ранейшаму цяжка зрабіць у базе дадзеных. (Хаця Ёсць мноства спосабаў абысці гэтую праблему, некаторыя з іх, здаецца, у выкарыстанні.)
Мы таксама сутыкнуліся з асноўнай праблемай, што вялікая дасведчанасць аб лагічных - або фізічная - Прадстаўленне дадзеных патрабуецца з боку распрацоўніка - замест таго, каб проста факусоўкі аб тым, як аб'екты звязаны адзін з адным (з дапамогай простых аб'яднанняў такія як масівы або калекцыі асобнікаў), распрацоўшчык павінен зараз маюць больш дасведчанасці аб форме, у якой захоўваюцца аб'екты, у выніку чаго сістэма некалькі уразлівых для змянення схемы базы дадзеных. Гэта часам ліквідуюць з дапамогай гібрыднага падыходу паміж двума, прычым сістэма будзе браць на сябе адказнасць для інтэрпрэтацыі асацыяцый, пакідаючы распрацоўніку пісаць нешта накшталт гэтага:
Query q = new Query();
Field lastNameFieldFromPerson = Person.class.getDeclaredField("lastName");
q.From(Person.class).Where(new EqualsCriteria(lastNameFieldFromPerson, "Smith"));
ObjectCollection oc = QueryExecutor.execute(q);
, Якая вырашае частку схемы па павышэнню дасведчанасці і праблемы "тлушчу дрочит" праблемы, але ўсё яшчэ пакідае уразлівымі для распрацоўнікаў заклапочанасць шматслоўны і па-ранейшаму не разглядае складанасці разам больш складаных запытаў, такія як мульты-стол (або мульты-класа, калі хочаце) запыт Рэгістрацыя па некалькіх крытэрыях ў рознаму. Дык вось, наступнай задачай з'яўляецца стварэнне "Запыт-К-мова" падыход, пры якім новы мову, падобны на SQL, але "лепш" як-то, напісана для падтрымкі роду складаных і магутных запытаў звычайна падтрымліваецца SQL ; OQL і HQL два прыкладу гэтага. Праблема тут у тым, што часта гэтыя мовы з'яўляюцца падмноствам SQL і, такім чынам, не даюць поўную моц SQL. Што яшчэ больш важна, O / R пласт мае ў цяперашні час страчаны важныя "кропкі продажу", што з "аб'ектаў і толькі тыя аб'екты," мантра, што спарадзіў яго ў першую чаргу, выкарыстанне SQL-падобны мова амаль так жа, як з дапамогай SQL сябе, так як яна можа быць больш "objectish"? Пакуль распрацоўшчыкі не павінны ведаць аб фізічнай схемы мадэлі дадзеных (інтэрпрэтатар мовы запытаў / выканаўца можа зрабіць адлюстраванне абмяркоўвалася раней), распрацоўнікам неабходна будзе ведаць, як аб'ект асацыяцый і ўласцівасці прадстаўлены ў мове, і падмноства магчымасцяў аб'екта ў мове запытаў - напрыклад, можна напісаць нешта накшталт гэтага?
SELECT Person p1, Person p2 FROM Person WHERE p1.getSpouse() == null AND p2.getSpouse() == null AND p1.isThisAnAcceptableSpouse(p2) AND p2.isThisAnAcceptableSpouse(p1);Іншымі словамі, сканаваць базы дадзеных і знайсці ўсе адзінокія людзі, якія знаходзяць адзін аднаго прымальным. Хоць "isThisAnAcceptableSpouse" метад выразна метад, які належыць на клас Чалавек (кожны асобнік асоба можа мець свае ўласныя крытэры, па якіх судзіць прымальнасці яшчэ адзін сінгл - яны бландынкі, брунэткі, рудыя або, якія яны зарабляюць больш $ 100.000 у год, і гэтак далей), то не зразумела, калі выкананне гэтага метаду магчыма ў мове запытаў, і не зразумела, калі яно павінна быць. Нават для самых трывіяльных рэалізацый, сур'ёзны ўдар прадукцыйнасці будзе, верагодна, асабліва калі O / R пласта павінны звярнуцца рэляцыйных даных слупка ў аб'екты для выканання запыту. Акрамя таго, у нас няма гарантый таго, што распрацоўшчык піша гэты метад, каб быць эфектыўным на ўсіх, і няма спосабу выканання якога-небудзь прадукцыйнасці вядома рэалізацыі.
(Крытыкі сцвярджаюць, што гэта рэальны пытанне, прапануе два магчымых рашэння Адзін з іх кадуе дадзеныя аб перавагах ў асобную табліцу і зрабіць гэтую частку запыту;. Гэта прывядзе да жудасна складаны запыт, які зойме некалькі старонак і, верагодна, спатрэбіцца экспертаў SQL, каб разблытаць пазней, калі новыя ільготныя крытэры хочаце дадаць. іншае для кадавання "прымальнасці" рэалізацыі ў захоўваемую працэдуру ў базе даных, якая ў цяперашні час здымае код цалкам з аб'ектная мадэль і пакідае нас без "аб'ект"-рашэнне на базе бы то ні было - прымальна, але толькі калі вы прымаеце перадумовы, што не ўсе рэалізацыі могуць адпачыць ўнутры аб'екта сама мадэль, якая адхіляе "аб'ектаў і нічога, акрамя аб'ектаў" памяшканне, з якой многія O / R адвакатаў адкрыць свае аргументаў.)
Частковае-праблемны аб'ект і час загрузкі Paradox
Ужо даўно вядома, што сетка абыходу, напрыклад, зроблена пры прыняцці традыцыйнай запыт SQL, патрабуецца значная колькасць часу для апрацоўкі. (Чарнавыя крытэраў размясцілі гэта значэнне ў любым месцы ад трох да пяці парадкаў, у параўнанні з простай выклік метаду або Java або;. NET платформа 5 прыкладна аналагічна, калі яна прымае вас праз дваццаць хвілін, каб дабрацца да працы раніцай, і мы заклікаем, што час, неабходнае для выканання мясцовага выкліку метаду, на чатыры парадку велічыні, што прыкладна час, неабходнае для падарожжа да Плютона, ці проста саромеюцца чатырнаццаць гадоў, у адзін бок.) Гэтыя выдаткі відавочна нетрывіяльна, так як у выніку, распрацоўшчыкі шукаюць спосабы мінімізаваць гэтыя выдаткі за кошт аптымізацыі колькасць цыклаў і дадзеныя, атрыманыя.
У SQL, гэта аптымізацыя дасягаецца шляхам дбайнага структуравання запыт SQL, пераканаўшыся, што для атрымання толькі слупкі і / або табліцы жаданага, а не ўсёй табліцы або набору табліц. Напрыклад, пры пабудове традыцыйных інтэрфейс дэталізацыі карыстальнік, распрацоўшчык ўяўляе рэзюмэ адлюстраванне ўсіх запісаў, з якіх карыстальнік можа выбраць адзін, і адзін раз абраны, распрацоўшчык затым адлюстроўвае поўны набор дадзеных для гэтай канкрэтнай запісу. Улічваючы, што мы хочам зрабіць дэталізацыі фізічных асоб рэляцыйнага тыпу апісаных вышэй, напрыклад, два запыту, зрабіць гэта будзе ў парадку (калі першы не выбрана):
SELECT id, first_name, last_name FROM person; SELECT * FROM person WHERE id = 1;У прыватнасці, звярніце ўвагу, што толькі дадзеныя жаданага на кожным этапе працэсу здабываецца - у першым запыце, неабходныя інфармацыю і ідэнтыфікатар (для наступных запытаў, у выпадку імя і прозвішча не будзе дастаткова, каб ідэнтыфікаваць асоба, непасрэдна), а па-другое, астатняя частка дадзеных для адлюстравання. На самай справе, большасць SQL экспертаў будзе пазбягаць "*" подстановочные калонцы сінтаксіс, аддаючы перавагу замест гэтага імя кожнага слупкі ў запыце, як для працы і абслугоўвання прычын - прадукцыйнасць, так як база дадзеных будзе лепш аптымізаваць запыт, і абслугоўванне, таму што будзе менш шанцаў непатрэбных слупкоў, вяртаецца адміністратараў баз дадзеных або распрацоўнікаў развівацца і / ці рэарганізаваць табліцы базы дадзеных (ов). Гэта паняцце, якое дазваляе вярнуць частку табліцы (хоць яшчэ ў рэляцыйнай форме, што важна з прычыны закрыцця, апісаных вышэй) мае фундаментальнае значэнне для здольнасці аптымізаваць гэтыя запыты так - большасць запытаў, па сутнасці, патрабуецца толькі частка поўнага адносіны.
Гэта ўяўляе праблему для большасці, калі не ўсё, аб'ектна-рэляцыйнага пласты адлюстравання: мэта любога O / R з'яўляецца прадастаўленне распрацоўнікам гл. "нічога, акрамя аб'ектаў", і яшчэ рэляцыйныя пласт не можа сказаць, ад аднаго запыту да іншага, як аб'екты, якія вяртаюцца запытам будзе выкарыстоўвацца. Напрыклад, цалкам магчыма, што большасць распрацоўнікаў захоча напісаць што-то ўздоўж ліній:
Person[] all = QueryManager.execute(...); Person selected = DisplayPersonsForSelection(all); DisplayPersonData(selected);Значэнне, іншымі словамі, што, як толькі твар, якое будзе адлюстроўвацца была абраная з масіва асоб, ніякіх далейшых дзеянняў пошуку неабходна - у рэшце рэшт, у вас ёсць аб'ект, што яшчэ павінна быць трэба?
Праблема тут у тым, што дадзеныя, якія будуць адлюстроўвацца ў першым...() выкліку дысплей не поўны чалавек, але падмноства гэтых дадзеных, тут мы сутыкаемся з нашай першай праблемы, у тым, што аб'ектна-арыентаваная сістэма, як C # або Java не можа вярнуць толькі "часткамі" аб'ект - аб'ект з'яўляецца аб'ектам, а калі аб'ект чалавека складаецца з 12 палёў, то ўсе 12 палёў будзе прысутнічаць у кожным чалавеку вярнуўся. Гэта азначае, што сістэма сутыкаецца з адной з трох нязручна выбар: адзін, патрабуюць, каб твар аб'екты павінны быць у стане размясціць "абнуляецца" палёў, незалежна ад вобласці абмежаванні супраць гэтага, два, вяртанне твар цалкам запоўненыя ўсе звестак, якія складаюць Твар аб'екта, ці тры, забяспечыць нейкі нагрузкі па патрабаванню, што атрымаем гэтыя палі, калі і калі распрацоўшчык доступу да дадзеных поля, нават ускосна, магчыма, шляхам выкліку метаду.
(Майце на ўвазе, што некаторыя аб'ектна-арыентаванага мовы, такія, як ECMAScript, праглядаць аб'екты інакш, чым на аснове класаў моў, такіх як Java або C # ці C + +, і, як вынік, цалкам магчыма вярнуць аб'екты, якія ўтрымліваюць розная колькасць палёў. Гэта сказаў, аднак, некалькі моў валодаюць такім падыходам, нават не ўсе любімыя дынамічных моў пераймання, Ruby, і да тых моў стала шырока распаўсюджаным, такое абмеркаванне застаецца за рамкамі гэтага артыкула.)
Для большасці O / R пластоў, гэта азначае, што аб'екты і / або палёў аб'ектаў павінны быць атрыманы ў лянівых загружаны чынам, атрыманне дадзеных на месцах па патрабаванні, так як атрыманне ўсіх палёў усіх аб'ектаў Твар / адносіны будуць " ясна "будзе велізарнай марнаваннем прапускной здольнасці для дадзенага сцэнарыя. Як правіла, увесь набор аб'ектаў палёў будуць атрыманыя, калі любое поле пакуль яшчэ не вярнуўся доступ. (Гэты падыход з'яўляецца пераважнай, каб падыход поля на поле, таму што ёсць менш шанцаў "N 1 запыту праблемы", у якім атрымання ўсіх дадзеных ад аб'екта патрабуецца 1 запыт для атрымання першаснага ключа + N запытаў для атрымання кожнага. поля з табліцы па меры неабходнасці Гэта мінімізуе колькасць спажываных рэсурсаў для атрымання даных - не unaccessed полі будзе мець свае дадзеныя, атрыманыя -. але відавочна не ўдаецца звесці да мінімуму паездкі сеткі раунд)
На жаль, палі ў аб'екце толькі частка праблемы - іншыя праблемы з якімі мы сутыкаемся ў тым, што аб'екты часта звязаныя з іншымі аб'ектамі, у розных магутнасцяў (адзін-да-аднаму, адзін-да-многім, многія-да-One, многія-да-многім), і O / R адлюстраванне павінен зрабіць некалькі папярэдніх рашэнняў аб тым, калі для атрымання гэтых звязаных з імі аб'ектаў, і, нягледзячы на ??ўсе намаганні O / распрацоўнікам RM 'S, заўсёды будуць агульныя сцэнарыі выкарыстання дзе рашэннем будзе дакладна няправільна, што трэба рабіць. Большасць O / RM "S прапануюць нейкія распрацоўшчык кіраваных падтрымкі прыняцця рашэнняў, як правіла, нейкі файл канфігурацыі або адлюстравання, каб сапраўды вызначыць, якія пошуку палітыка будзе, але гэты параметр з'яўляецца глабальным для класа, і як такая можа" т быць зменены на аснове сітуацыйнага.
Рэзюмэ
Улічваючы, тое, што аб'екты да рэляцыйнай адлюстравання неабходнасць у сучаснай сістэме прадпрыемствы, як можна абвяшчаць гэта балота, з якога няма выйсця? Зноў жа, В'етнам выступае ў якасці карыснай аналогія тут - у той час як сітуацыя ў Паўднёвай Індакітаі патрабуецца адказ ад амерыканцаў, там былі розныя адказы даступныя для Кэнэдзі і Джосон адміністрацый, у тым ліку такі ж адказ, што нядаўняе падзенне рэжыму Сухарта ў Малайзіі генеруецца з ЗША, які павінен сказаць, ні адна на ўсіх. (Памятайце, што Эйзенхаўэр і Далеса не лічыць Паўднёвай Індакітаі, каб быць часткай тэорыі даміно, у першую чаргу;. Яны былі значна больш заклапочаныя Японіі і Еўропе)
Некаторыя магчымыя рашэнні з'явіцца ў O / RM праблему, некаторыя патрабуюць нейкі "глабальныя" дзеянні супольнасці ў цэлым, некаторыя больш даступным для развіцця каманды "у акопах":
- Пакіданне. Распрацоўшчыкі проста адмовіцца ад аб'ектаў цалкам, і вярнуцца да мадэлі праграмавання, што не стварае аб'ект / рэляцыйных неадпаведнасці імпедансу. Хоць непрыемна, у некаторых сцэнарах аб'ектна-арыентаваны падыход стварае больш рэсурсаў, чым ён эканоміць, і ROI проста не існуе, каб апраўдаць выдаткі на стварэнне багатай мадэлі прадметнай вобласці. ([Фаулер] кажа аб гэтым з некаторай глыбіні.) Гэта выключае праблемы вельмі акуратна, таму што, калі Ёсць няма аб'ектаў, няма неадпаведнасці.
- Шчырае прызнанне. Распрацоўшчыкі проста адмовіцца ад рэляцыйнай захоўвання цалкам, і выкарыстоўваць мадэлі захоўвання, які падыходзіць, як іх мовы выбару глядзець на свет. Аб'ект-сістэм захоўвання дадзеных, такіх як db4o праекта, вырашыць праблемы акуратна захоўвання аб'ектаў непасрэдна на дыск, ухіляючы шматлікія (але не ўсе) з вышэйзгаданых пытанняў, няма "другі схемы", напрыклад, таму што толькі схема, выкарыстоўваная з'яўляецца тое, што з вызначэння аб'ектаў самі. Хаця многія адміністратары баз дадзеных, аслабнуць мёртвых далёка ў думкі, у больш сэрвіс-арыентаванай свеце, які не прымае ідэю прамога доступу да дадзеных, але замест гэтага патрабуе ад усіх доступам праходзяць службу шлюза Такім чынам інкапсуляцыі механізм захоўвання ўдалечыні ад цікаўных вачэй, ён становіцца цалкам магчыма прадставіць распрацоўнікам захоўваць дадзеныя ў форму, якая значна прасцей для іх выкарыстання, а не адміністратараў баз дадзеных.
- Кіраўніцтва адлюстраванне. Распрацоўшчыкі проста прызнаць, што гэта не такая складаная праблема, каб вырашаць уручную ў канцы канцоў, і пісаць прама-код доступу рэляцыйных вярнуць адносіны да мовы, доступ картэжаў, і запаўненне аб'ектаў па меры неабходнасці. У многіх выпадках гэты код можа быць нават аўтаматычна ствараецца інструмент вывучэння базы метададзеных, выключаючы некаторыя галоўныя крытыкі такога падыходу (што, быўшы "Гэта занадта шмат кода пісаць і падтрымліваць").
- Прыняцце O / RM абмежаванні. Распрацоўшчыкі проста прызнаць, што няма ніякага спосабу, каб эфектыўна і лёгка зачыніць пятлю на O / R неадпаведнасці і выкарыстоўваць O / RM, каб вырашыць 80% (ці 50% ці 95%, або як працэнт Уяўляецца мэтазгодным) задачы і выкарыстоўваць SQL і рэляцыйных-доступу (напрыклад, "сырыя" JDBC або ADO.NET) правесці іх міма тых абласцей, дзе O / RM б стварыць праблемы. Гэта нясе сваю ўласную долю рызык, аднак, як распрацоўнікі, выкарыстоўвалыя O / RM павінны быць вядомыя якія-небудзь кэшаваньня O / RM рашэнне робіць у ім, таму што "волкі" рэляцыйныя доступ, відавочна, не зможа скарыстацца што кэшаванне пласта.
- Інтэграцыя рэляцыйных паняццяў у мовах. Распрацоўшчыкі проста прызнаць, што гэта праблема, якая павінна быць вырашана мовы, а не бібліятэкі або базы. За апошняе дзесяцігоддзе ці больш, акцэнт на рашэнні для O / R праблемы былі засяроджаныя на спробах давесці аб'екты бліжэй да базы дадзеных, так што распрацоўшчыкі могуць засяродзіцца выключна на праграмаванне ў адной парадыгмы (што парадыгмы быцця, вядома, аб'екты ). За апошнія некалькі гадоў, аднак, цікавасць да "сцэнарыяў" моў з значна мацней, набор і спіс падтрымкі, як Ruby, выклікала ідэя, што, магчыма іншае рашэнне падыходзіць: прынесці рэляцыйных (які, па сутнасці, з'яўляюцца на аснове набораў) ў асноўных мовах праграмавання, што робіць яго лягчэй пераадолець разрыў паміж "мноства" і "аб'екты". Праца ў гэтай прасторы дагэтуль былі абмежаваныя, абмежаваным асноўным навукова-даследчых праектаў і / ці "Fringe" моў, але некалькі цікавых намаганні набываюць бачнасць у рамках супольнасці, такіх як функцыянальныя / аб'ект гібрыдных моў, такіх як Scala або F #, а таксама прамых інтэграцыі ў традыцыйныя мовы О.О., такіх, як праект LINQ ад Microsoft для C # і Visual Basic. Адзін з такіх намаганняў, што не атрымалася, на жаль, SQL / J стратэгіі; нават там, падыход быў абмежаваны, не імкнецца ўключаць мноства ў Java, а проста дазваляе для ўбудаваных SQL выклікаў для папярэдняй апрацоўкі і перакладаецца ў код JDBC перакладчыкам.
- Інтэграцыя рэляцыйных ў рамкі. Распрацоўшчыкі проста прызнаць, што гэтая задача адрозная, але толькі з змяненнем перспектывы. Замест таго каб спадзявацца на мове або бібліятэкі дызайнераў вырашыць гэтую праблему, распрацоўшчыкі прытрымліваюцца іншага меркавання "аб'ектаў", які з'яўляецца больш рэляцыйных ў прыродзе, будынак вобласць рамкі, якія больш непасрэдна пабудаваны вакол рэляцыйнай канструкцый. Напрыклад, замест стварэння класа асоба, якая валодае сваёй асобнік дадзеных непасрэдна ў палі ўнутры аб'екта, распрацоўнікам ствараць клас асоба, якая валодае сваёй асобнік дадзеных радкоў (Java) або набор дадзеных (C #), напрыклад, якія могуць быць сабраны з іншымі Наборы радкоў / набораў дадзеных у лёгка-судна блок дадзеных для абнаўлення ў базе дадзеных, або вынуты з базы дадзеных у асобных аб'ектаў.
Падобна таму, як гэта магчыма, што ЗША маглі б дамагчыся якой-то меры "Поспех" у В'етнаме, калі б зведзена да выразнай стратэгіі і разумець больш выразная сувязь паміж абавязаннямі і вынікі (ROI, калі хочаце), то магчыма, што аб'ект / рэляцыйных Праблема можа быць "выйграў" на аснове ўважлівага і разумнае прымяненне стратэгіі, celarly ўсведамляе свае ўласныя абмежаванні. Распрацоўшчыкі павінны быць гатовыя прыняць "перамогі", дзе яны могуць атрымаць іх, і не патрапіць у пастку слізкі шлях, гледзячы для стварэння рашэнняў, якія ўсё больш каштаваць больш, і ўраджайнасць менш. На жаль, гісторыя паказвае, вайны ў В'етнаме, нават ўсведамленне небяспекі слізкі шлях часта не дастаткова, каб пазбегнуць траплення ўгразлі ў дрыгве. Горш таго, гэта балота, што проста занадта прывабным, каб адмовіцца, песня сірэны, што па-ранейшаму прыцягвае развіццё каманды з усіх памераў карпарацый (у тым ліку на Microsoft, IBM, Oracle і Sun, каб назваць некаторыя з іх) у адносінах да парод, з уражлівых вынікаў. Lash сябе да мачце, калі вы хочаце пачуць песню, але хай маракі радка.
Нататкі
1 Пазней аналіз прынцыпаў ўдзел - у тым ліку тагачасны міністр абароны Роберт Макнамара - сказаў на заканчэнне, што палова атакі нават не адбыўся.
2 Гэта, мабыць, найбольшую іронія вайны, што чалавек, лёс абраных вестак падчас замежных заблытанасці Амерыкі найбуйнейшых была лідэрам якой асноўная ўвага была цалкам накіраваныя ў яго ўласных берагоў. Калі б абставіны не згаварыліся інакш, хіпі, скандуючы: "Эй, эй, Ліндана Джонсана, колькі хлопчыкаў ты забіў сёння" па-за Авальнай кабінета можа вельмі добра былі Джонсана стойкіх прыхільнікаў.
3 Па іроніі лёсу, інкапсуляцыя, у мэтах забеспячэння прастаты, аказваецца асноўны матывацыяй для амаль ўсіх з асноўных новаўвядзенняў у лінгвістычных кампутарных навук - працэдурны, функцыянальны, прадмет, аспект, нават рэляцыйных тэхналогій ([Date02]) і іншых мовах усе прывесці "інкапсуляцыі" у якасці асноўных рухаючых фактараў.
4 Мы маглі б, магчыма, разгледзець захоўваемых працэдур моў, такіх як T-SQL ці PL / SQL, каб быць "рэляцыйных" моў праграмавання, але нават у гэтым выпадку, гэта надзвычай цяжка пабудаваць карыстальніцкага інтэрфейсу ў PL / SQL.
5 У гэтым выпадку, я быў ??вымярэння Java RMI выклікі метадаў у дачыненні да мясцовых выклікаў метадаў. Аналагічныя вынікі даволі лёгка даступныя для SQL аснове доступу да дадзеных шляхам вымярэння па-за працэс выклікае супраць ў працэсе выклікаў з выкарыстаннем базы дадзеных прадукт, які падтрымлівае як, напрыклад, Cloudscape / Derby ці HSQL (гіпергукавыя SQL).
Спіс літаратуры
[Фасселл]: Асновы аб'ектна-рэляцыйнага супастаўлення, Марк Л. Фасселл, v0.2 (МФ-970703)
[Фаулер] Мадэлі карпаратыўнай архітэктуры прыкладанняў, Марцін Фаулер
[Date04]: Увядзенне ў сістэмы баз дадзеных, 8 Edition, па даце Крыс.
[Neward04]: Эфектыўнае Java Enterprise
From users like you
“I am very impressed. The loan officers at Hanscom were great. They called me within minutes and took care of all the paperwork within the next twenty-four hours. Thanks to MoneyAisle, I am saving over $200 a month on my car payment.” -Oliver, Waltham, MA
“These were the fastest $2,000 we have ever made! With the help of MoneyAisle and their incredible service, we got both of our cars re-financed in no-time! Our truck went down from a 9.59% APR to a 2.99% APR ,and we saved $1,195. The other car went down because we got a nice 3.49% APR. On this loan we saved $885,which brings our total savings to: $2080! Thank you MoneyAisle!!!” -Gerlinde & Anton, Queen Creek, AZmore from people like you

