Datová vrstva Best Practices




Jsem uprostřed „diskuse“ s kolegou o tom, jak nejlépe realizovat vrstvy dat v nové žádosti.


Jedním hlediskem je, že datová vrstva musí být vědomi podnikatelských objektů (naše vlastní třídy, které představují entitu), a musí být schopen pracovat s tímto objektem nativně. 


Protilehlá hledisko je, že data vrstva by měla být objektově agnostik, a pouze pomocí jednoduchých datových typů (řetězce, bools, data, atd)


Vidím, že oba přístupy mohou být platný, ale můj vlastní názor je, že dávám přednost první. Tímto způsobem, pokud se změní médium pro ukládání dat, obchodní vrstva nemusí (nezbytně) muset změnit, aby se přizpůsobila nové datové vrstvy. Bylo by tedy triviální věc pro změnu z úložiště dat SQL na serializovaném obchodě xml souborového systému.


bod mého kolegy pohledu je, že datová vrstva by neměla mít vědět o definicích objektů, a to tak dlouho, dokud budou data předána o vhodně, to je dost. 


Vím, že toto je jedna z těch otázek, které má potenciál začít náboženskou válku, ale ocenil bych jakoukoli zpětnou vazbu od komunity o tom, jak se budete blížit takové věci. 


TIA
To opravdu záleží na vašem pohledu na svět - jsem býval v odpojeném táboře. Dal byl jen tam dodávat data do BAL - konec příběhu.


Díky nové technologie, jako je LINQ to SQL a Entity Framework stává trochu více populární, pak je hranice mezi DAL a BAL byly rozmazané trochu. V L2S je především vaše DAL docela pevně spojen s obchodními objekty, jak objektový model má 1-1 mapování do databáze pole.


Stejně jako cokoli ve vývoji softwaru není správná nebo špatná odpověď. Musíte pochopit vaše požadavky a budoucí požadavky se a pracovat odtamtud. Já bych nic víc používat Ferrari na Dakhar rally jako bych Range Rover v den trati.
<p>databázi na straně serveru a programovací jazyk, který vyberete, je zcela na vás, protože zákazník nebude vědět, ani se nestará o to, v jakém jazyce je napsán, dokud bude fungovat. a protože ovládáte prostředí serveru, můžete použít cokoli, co chcete. vyberte si programovací jazyk a databázi, se kterou váš tým bude snadno pracovat a bude nejznámější.</p><p>pokud jde o stranu klienta, nemusíte si vybírat mezi flashem nebo javascriptem. můžete použít oba, pokud slouží určitému účelu. pokud je něco jednoduše animací kvůli animaci, flash je dobrá volba, protože je snadné vytvářet animace. a pokud někdo nemá přístup k blesku, například na mobilním zařízení, nebude mu chybět žádná funkčnost. pokud jsou animované bity funkční částí webové stránky, javí se javascript jako dobrý nástroj k použití.</p><p>fyi, ve webdesignu a programování není nic takového jako „příliš starý“. k dispozici je pouze ten správný nástroj a ne.</p> ORM může být váš nejlepší řešení.   

Nebo použít typ úložiště vzor, s „thingContext“ objekt, který je zodpovědný za státní vytrvalost.


Osobně používám Active Record, kde ušetřit logiku se peče do základní třídy, ale já odjíždím to ve prospěch NHibernate stylu úložiště vzor. Příspěvek na DDD a testování věci bez db je velmi příjemné mít v rámcové typu situace, kdy je moje obchodní logiky nyní získává trakci na novém uživatelském rozhraní. <blockquote> <p>„musí existovat dobrá metrika, aby bylo možné určit, kdy je vhodné použít rámec.“</p> </blockquote><p>spíš ne. kdyby existovaly dobré metriky pro určení vhodného použití jakékoli technologie, neviděli byste svaté války v jazyce, editoru a metodice.</p><p>skupiny, se kterými jsem spolupracoval, dělají totéž - odhadněte si náklady a přínosy, zvolte nejproduktivnější cestu a doufejte, že mají pravdu. není to strašně vědecké - jedna část intuice, tři části zkušenosti, jedna část náchylnost k marketingu, jedna část mazaný a pět částí hodnotí názor.</p> <p>už nemůžu najít ten pravý příspěvek, ale eric lippert (a možná i několik dalších softies) se při několika příležitostech opíral o to, jak je linq <strong>deklarativní</strong>, což je pro několik tříd problémů mnohem intuitivnější než <strong>imperativní</strong> syntaxe.</p><p>linq umožňuje psát kód, který vyjadřuje <em> záměr </em>, nikoli mechanismus <em> </em> .</p><p>řekni mi, co je lépe čitelné. tento:</p><pre class="lang-cs prettyprint-override"><code>ienumerable&lt;customer&gt; getvipcustomers(ienumerable&lt;customer&gt; source) { list&lt;customer&gt; results = new list&lt;customer&gt;(); foreach (customer c in source) { if (c.firstname == "aaron") { results.add(c); } } results.sort(new lastnamecomparer()); return results; } class lastnamecomparer : icomparer&lt;customer&gt; { public int compare(customer a, customer b) { return x.lastname.compareto(b.lastname); } } </code></pre><p>nebo toto?</p><pre class="lang-cs prettyprint-override"><code>ienumerable&lt;customer&gt; getvipcustomers(ienumerable&lt;customer&gt; source) { return from c in source where c.firstname == "aaron" orderby c.lastname select c; } </code></pre><p>nebo dokonce tohle?</p><pre class="lang-cs prettyprint-override"><code>ienumerable&lt;customer&gt; getvipcustomers(ienumerable&lt;customer&gt; source) { return source.where(c =&gt; c.firstname == "aaron").orderby(c =&gt; c.lastname); } </code></pre><p>prvním příkladem je jen svazek zbytečných kotlových desek, aby bylo dosaženo co nejjednodušších výsledků. každý, kdo si myslí, že je <em> více </em> čitelnější než verze linq, musí nechat vyšetřit hlavu. nejen to, ale první ztrácí paměť. nemůžete to ani napsat pomocí <code>yield return</code> kvůli třídění.</p><p>váš spolupracovník může říct, co chce; osobně si myslím, že linq nezměřitelně zlepšil <em> můj </em> kód čitelnosti.</p><p>ani o linqovi není nic „relačního“. může mít některé povrchové podobnosti s sql, ale nepokouší se v jakémkoli tvaru nebo formě implementovat relační počet. je to jen banda rozšíření, která usnadňují vyhledávání a projektování sekvencí. „dotaz“ neznamená „relační“ a ve skutečnosti existuje několik nerelačních databází, které používají syntaxi podobnou sql. linq je <em> čistě </em> objektově orientovaný, prostě se stává, že pracuje s relačními databázemi prostřednictvím frameworků jako linq do sql kvůli nějakému výrazu voodoo stromů a chytrému designu od tým c #, čímž se anonymní funkce implicitně převádějí na stromy výrazů.</p> <p>jednoduchá řešení jsou lepší pro dlouhodobou údržbu. a nejde vždy jen o jazykovou znalost. složitá čára (nebo čáry) vyžaduje určitý čas, i když jste odborníkem na daný jazyk. otevřete soubor a začnete číst: "ok, jednoduché, jednoduché, rozumíte, jo, wtf ?!" váš mozek se zastaví a budete muset zastavit a dešifrovat složitou linii. pokud neexistoval měřitelný a konkrétní důvod této implementace, je to „příliš chytré“.</p><p>zjistit, co se děje, se progresivně zhoršuje, jak složitost roste z chytré metody na chytrou třídu na chytrou strukturu. kromě známých přístupů musíte přijít na myšlenkový proces, který šel do vytvoření „chytrého“ řešení, což může být docela obtížné.</p><p>to znamená, že nerad se vyhýbám vzoru (když je jeho použití oprávněné) jen proto, že mu někdo nemusí rozumět. je na nás jako vývojářích, abychom se neustále učili, a pokud něčemu nerozumíme, je to důvod, proč se to učit, a ne se mu vyhýbat.</p> <p>obecně platí, že byste měli používat dialogová okna pouze tehdy, když musíte. je výhodné použít přímou manipulaci nebo zadávání nebo úpravy na místě, kde uživatel pracuje přímo na datových objektech reprezentovaných v primárním okně. v případě vytváření objektů má přístup úpravy na místě buď:</p><ul> <li> <p>tlačítko vložit, které vytvoří objekt a přidá do datové mřížky prázdný řádek pro zadání hodnot pole,</p> </li> <li> <p>trvalý prázdný řádek v dolní části datové mřížky (nebo jinde) - pokud do ní uživatel zadá hodnoty, aplikace vytvoří nový objekt.</p> </li> </ul><p>srovnávám tyto dva přístupy so v odpovědi na otázku „ <a href="https://stackoverflow.com/questions/667539/whats-best-when-inserting-into-a-table-view-and-add-button-or-a-blank-line/669176#669176">co je nejlepší při vkládání do zobrazení tabulky, tlačítka přidat nebo prázdný řádek?</a> “</p><p>ve srovnání s přístupy upravenými na místě mají dialogová okna následující nevýhody:</p><ul> <li> <p>další učení. přidá do aplikace okno, jeho záhlaví a tlačítka (např. ok a storno) a pole - pole, která již často existují na nadřazené datové mřížce, ale jsou uspořádána jinak. to postupně zvyšuje to, co se uživatelé musí naučit.</p> </li> <li> <p>posun pozornosti. vyskakování dialogu vyžaduje, aby uživatel přesunul pozornost na něco nového, což má určité náklady na opětovnou orientaci a aby se uživatel cítil méně pod kontrolou dat.</p> </li> <li> <p>další kliknutí. dialogová pole je třeba provést a zrušit. to vyžaduje alespoň jedno kliknutí navíc. naproti tomu s úpravami na místě může uživatel před uložením vytvořit více objektů (pokud ukládání není automatické).</p> </li> <li> <p>modalita. pokud musíte mít modální dialogové okno, odstraňujete flexibilitu uživatele a nutíte uživatele dokončit vytvoření nebo jej opustit. pokud pro dokončení vytváření potřebují další informace odjinud v aplikaci, jsou nuceni zahodit veškerou práci, kterou odvedli.</p> </li> <li> <p>riziko ztráty práce. jedním neúmyslným kliknutím na tlačítko storno se vrací jakýkoli vstup, který uživatel provedl, a dialogové okno se zruší, což uživatele nutí začít znovu. ztráta více vstupů jediným kliknutím není charakteristická pro správně navržená primární okna a primární okna obvykle podporují zpět.</p> </li> </ul><p>dialogy by měly být použity pro atomové akce, které vyžadují parametry; to je situace, kdy aplikace musí mít určitý vstup od uživatele, aby mohla akci technicky nebo logicky dokončit. pokud například vytvoření objektu vyžaduje hodnoty polí, které nelze přednastavit, je pravděpodobně vhodné použít dialog.</p><p>takový dialog vytvořit by měl pravděpodobně obsahovat pouze povinná pole, nikoli žádná nepovinná. nechte uživatele vyplnit všechna volitelná pole zpět na datové mřížce. z důvodu modality a rizika ztráty práce by dialogy měly být co nejjednodušší. jako hrubé pravidlo by uživatel měl být schopen dokončit vstup za přibližně 20 až 30 sekund - to je přijatelné množství práce, kterou musí znovu provést.</p><p>máte pravdu, že ve webových aplikacích je samostatná vstupní stránka do značné míry ekvivalentní modálnímu dialogovému oknu, kde je uživatel nucen dokončit nebo zrušit transakci dříve, než učiní cokoli jiného. to dává mnoha webovým aplikacím neohrabaný „nepřímý“ pocit ve srovnání s tekutým pocitem ekvivalentu přímé manipulace s stolním počítačem.</p> <p>provozoval jsem systém s nejlepší částí z tisíce databází rozložených na více serverech. všechny byly identické struktury a byly synchronizovány s databází šablon, která byla na každém počítači.</p><p>to mi umožnilo migrovat databáze z jednoho db na druhý, pokud by se jeden příliš přetěžoval, a když se změnil klientský mix, mohl jsem na různých serverech vytvářet nové databáze, abych mohl načíst rovnováhu mezi servery. to byla největší výhoda, kterou jsem získal od systému, v tom, že jsem měl na několika samostatných serverech několik velkých kusů cínu, které prováděly více komplikovaných dotazů současně.</p><p>skvělá věc je, že můžete do konfigurace přidat servery svou vlastní rychlostí, protože každý server se začíná přetížit, přidat další do mixu, přenést některé dbs na nový server a skončit pěkně načíst vyváženou sadu serverů. opravdu pěkný a jednoduchý způsob, jak přidat měřítko do systému, kdykoli je to potřeba!</p><p>důvodem, proč jsem šel s tímto přístupem spíše než s jediným obrovským databázovým přístupem, byla naprostá velikost potenciální databáze, která by byla vytvořena ... každá z 1000 databází měla 200 tabulek a mnoho jednotlivých tabulek v každé z databáze obsahovaly mnoho stovek <strong>milionů</strong> řádků dat!</p><p>konfigurace jediné databáze by vyžadovala, aby určité tabulky (přibližně 8 z nich) měly více miliard řádků dat a celková velikost db by byla přes 10tb. podařilo se nám mít více serverů s 5tb úložiště raid 10, s mnoha databázemi na každém.</p><p>to bych udělal! doufám, že to pomůže vašemu rozhodování ... :)</p> <h2>v ideálním případě žádné</h2><p>ale to není vždy možné. nemohu vám dát tvrdá čísla jako 20% nebo 10 řádků, což je subjektivní do té míry, že na ni nelze odpovědět. dokážu popsat, jak používám návrhové vzory a okolnosti, které je vyžadují mírně ohýbat.</p><p>podle mého názoru je to zcela na účelu aplikace. vytváření jednoduchých rest api, které chcete zveřejnit? zapomněli jste na čisté oddělení nebo dokonce na vzor. můžete vypálit funkční verzi za hodinu. budování něčeho většího? pravděpodobně nejlepší na tom pracovat.</p><p>cílem je budování individuálně obsažených systémů. pokud začnete psát obchodní logiku, která je specifická pro to, jak dva systémy interagují, je to problém. aniž bych se na to dál díval, nemohu vyjádřit názor.</p><p>designové vzory jsou formy, některé je rádi striktně dodržují na základě principu a dobře napsaného kódu. přísné dodržování vzoru vám pravděpodobně nedá <em> špatný </em> kód, ale může to zabrat více času a způsobit, že budete psát <em> mnohem více </em> kód.</p><p>designové vzory jsou flexibilní, upravte je tak, aby vyhovovaly <em> vašim </em> potřebám. ohněte je příliš mnoho a oni se ale zlomí. <strong>víte, co potřebujete</strong> a vyberte vzorec vzoru, který je k tomu nejblíže.</p> V současné době jsou v kurzu SQL dartabáze. Takže pokud se chceš uplatnit, tak MS-SQL, Interbase, ORACLE, popř. nějaké ty internetové jako např. MySQL, PostgreeSQL apod. Každá databáze má vlastní programovací jazyk pro uložené procedury, vlastní datové typy apod.Program, ve kterém budeš vyvíjet soft je opět něco jiného. Ten většinou je univerzální a umí přistupovat k jakékoliv databázi.V současné době, pokud bych začínal, tak bych se orientoval směrem .NET a C#. <p>nosql znamená „nejen sql“ a obvykle to znamená, že databáze není relační databáze, která byla v posledních desetiletích velmi populární.</p><p>důvod, proč byl nosql v posledních letech tak populární, je hlavně proto, že když relační databáze vyroste z jednoho serveru, není už tak snadné používat. jinými slovy, v distribuovaném systému se příliš nevyrovnávají. všechny velké weby, které jste zmínili o googlu, yahoo, facebooku a amazonu (o digg moc nevím), mají spoustu dat a ukládají data do <strong> distribuovaných systémů </strong> pro několik důvody. může se stát, že data se nevejdou na jeden server, nebo existují <strong> požadavky na vysokou dostupnost </strong>.</p><h2>cap věta</h2><p>vlastnosti distribuovaného systému lze popsat <a href="http://en.wikipedia.org/wiki/cap\_theorem">cap věta</a> . ze tří vlastností můžete mít maximálně dvě:</p><ul> <li><strong> [~ # ~] c [~ # ~] </strong> onsistency</li> <li><strong> [~ # ~] a [~ # ~] </strong> dostupnost</li> <li>tolerance k síti <strong> [~ # ~] p [~ # ~] </strong> artitioning</li> </ul><p>amazon dynamo používá <a href="http://en.wikipedia.org/wiki/eventual\_consistency">event consistency</a> , aby se přiblížil a získal všechny tři vlastnosti. příspěvek <a href="http://www.allthingsdistributed.com/2007/10/amazons\_dynamo.html"><em> dynamo: amazon's highly available key-value store</em></a> stojí za přečtení, když se dozvíte o databázích nosql a distribuovaných systémech. amazon dynamo má vlastnosti a a p.</p><p>google používá odlišný přístup s <a href="http://en.wikipedia.org/wiki/bigtable">bigtable</a> , který má vlastnosti c a a.</p><h2>další nosql databáze</h2><p>jak jsem psal na začátku, existuje mnoho dalších druhů databází nosql, které jsou navrženy pro různé požadavky. např. grafové databáze jako <a href="http://neo4j.org/">neo4j</a> , databáze dokumentů jako <a href="http://couchdb.apache.org/">couchdb</a> a multimodel/objektové databáze jako <a href="http://orientdb.com/">orientdb</a> .</p><p>nakonec bych rád řekl, že relační databáze zůstanou populární. jsou velmi flexibilní a udržovatelné. nejsou však vždy tou nejlepší volbou.</p>