Datové modelování vazeb: Typy a implementace

Datové modelování vazeb je klíčový aspekt návrhu databází, který definuje vztahy mezi tabulkami a zajišťuje integritu dat. V tomto článku se zaměříme na různé typy vazeb, jejich implementaci a význam v kontextu databázových systémů a aplikací, včetně Windows Forms.

Úvod do datového modelování a vazeb

Databáze se obvykle neskládá pouze z jedné tabulky, ale z mnoha, desítek nebo stovek tabulek. Struktura databázových tabulek, tzv. datový model, odráží modelovanou skutečnost. Tabulky jsou mezi sebou provázány pomocí klíčů. Klíčem označujeme 1 až n sloupců tabulky. Rozlišujeme 2 typy klíčů: primární klíč a cizí klíč. Každá tabulka by měla obsahovat právě jeden primární klíč a 0 až N cizích klíčů. Primární klíč musí být definován tak, aby obsah sloupce nebo sloupců, které ho tvoří, byl v každém řádku tabulky unikátní. Jinými slovy hodnota primárního klíče, která je uložena v jednom řádku, se nesmí objevit v žádném dalším řádku. Pomocí cizích klíčů se definují vazby mezi tabulkami.

Typy vazeb mezi tabulkami

Poměry odpovídají počtu řádků, které si ve vázaných tabulkách odpovídají. Rozlišujeme tři základní typy vazeb:

  • Vazba 1:1 (one-to-one): Každému řádku z tabulky A se váže právě jeden řádek z tabulky B. Tato vazba je nejméně častá, protože obvykle není důvod rozdělovat popisovaný objekt do dvou tabulek, místo toho vytvoříme jednu velkou tabulku. Důvodem rozdělení může být limit databáze na počet sloupců jedné tabulky.

  • Vazba 1:n (one-to-many): Je nejčastější vazba, pomocí ní definujeme podřízený vztah tabulky B k tabulce A. Jednomu řádku tabulky A odpovídá 1 až N řádků tabulky B. O tabulce A mluvíme jako o nadřízené nebo rodičovské tabulce, o tabulce B jako o závislé nebo dětské tabulce. Jako klasický příklad vazby 1:n je matka a její děti. Matka může mít více dětí, ale každé dítě má právě jednu matku. Tato vazba se v relační databázi modeluje tak, že primární klíč rodičovské tabulky vložíme do tabulky dětské, kde o něm mluvíme jako o cizím klíči. Dětská tabulka má tak jak vlastní primární klíč tak cizí klíč z rodičovské tabulky. Rodičovská tabulka zůstává nezměněna. Kromě vložení cizího klíče do dětské tabulky definujeme omezení tzv. constraint, čímž databázi sdělíme vytvoření vazby. Databáze následně zajistí, že ke každému řádku v dětské tabulce existuje právě jeden řádek v rodičovské tabulce. Při vkládání dat musíme začít vložením řídícího řádku a teprve následně vložit řádek nebo řádky to tabulky dětské.

    Čtěte také: Metodiky datového modelování

  • Vazba m:n (many-to-many): Příkladem této situace je například vztah mezi učiteli a studenty. Každý učitel učí více studentů, ale zároveň každý student navštěvuje hodiny několika učitelů. Pokud chceme namodelovat tuto vazbu, musíme vytvořit třetí vazební tabulku, ve které zkombinujeme primární klíče tabulky učitelů a studentů. Vazební tabulka tak obsahuje dva cizí klíče, které obvykle tvoří dohromady primární klíč této tabulky. Tímto způsobem dekomponujeme vazbu m:n na dvě vazby 1:n.

Datové modelování ve Windows Forms

Ve Windows Forms můžete svázat nejen s tradičními zdroji dat, ale také s téměř jakoukoli strukturou, která obsahuje data. Kromě toho můžete svázat libovolnou vlastnost libovolného ovládacího prvku se zdrojem dat. V tradiční datové vazbě obvykle svážete vlastnost zobrazení ( například vlastnost Text ovládacího prvku TextBox) se zdrojem dat. V .NET máte také možnost nastavit další vlastnosti prostřednictvím vazby. ADO.NET umožňuje vytvářet mnoho různých datových struktur tak, aby vyhovovaly potřebám vaší aplikace a datům, se kterými pracujete. Můžete chtít vytvořit vlastní třídy, které poskytují nebo využívají data ve Windows Forms. Tyto objekty můžou nabízet různé úrovně funkčnosti a složitosti.

Rozhraní pro datovou vazbu

Následující části popisují dvě skupiny objektů rozhraní. První skupina rozhraní je implementována ve zdrojích dat autory zdrojů dat. Příjemci zdrojů dat, jako jsou ovládací prvky Windows Forms nebo komponenty, implementují tato rozhraní. Druhá skupina rozhraní je navržená pro použití autory komponent. Autoři komponent používají tato rozhraní při vytváření komponenty, která podporuje datovou vazbu a kterou využívá modul datové vazby Windows Forms. Tato rozhraní můžete implementovat v rámci tříd přidružených k vašemu formuláři a povolit tak datovou vazbu. Každý případ představuje třídu, která implementuje rozhraní, které umožňuje interakci s daty.

Implementace rozhraní pro zdroje dat

  • IList: Třída, která implementuje rozhraní IList může být Array, ArrayList nebo CollectionBase. Jedná se o indexované seznamy položek typu Object a seznamy musí obsahovat homogenní typy, protože první položka indexu určuje typ. Pokud chcete vytvořit seznam obchodních objektů pro vazbu s Windows Forms, měli byste zvážit použití BindingList<T>.

  • IBindingList: Třída, která implementuje rozhraní IBindingList poskytuje mnohem vyšší úroveň funkcí datové vazby. Tato implementace nabízí základní možnosti řazení a oznámení o změnách. Obě jsou užitečné při změně položek seznamu a při změně samotného seznamu. Oznámení o změnách je důležité, pokud plánujete mít více ovládacích prvků svázané se stejnými daty. Typ změny popisuje vlastnost ListChangedType parametru ListChangedEventArgs. Proto se při každé aktualizaci datového modelu aktualizují také všechna závislá zobrazení, jako jsou jiné ovládací prvky vázané na stejný zdroj dat.

    Čtěte také: Ekonomický cyklus a podpora rodin

  • IBindingListView: Třída, která implementuje IBindingListView rozhraní poskytuje všechny funkce implementace IBindingList, spolu s filtrováním a pokročilými funkcemi řazení.

  • IEditableObject: Třída, která implementuje rozhraní IEditableObject, umožňuje objektu řídit, kdy mají být změny v daném objektu provedeny jako trvalé. Tato implementace podporuje BeginEdit, EndEdit a CancelEdit metody, které umožňují vrátit zpět změny provedené v objektu. Metoda BeginEdit signalizuje začátek úpravy objektu. Objekt, který implementuje toto rozhraní, bude muset uložit všechny aktualizace po volání metody BeginEdit způsobem, aby aktualizace lze zahodit, pokud je volána metoda CancelEdit. V datové vazbě Windows Forms můžete volat BeginEdit vícekrát v rámci jedné transakce úprav (například BeginEdit, BeginEdit, EndEdit). Implementace IEditableObject by měly kontrolovat, zda již byl BeginEdit volán, a ignorovat následná volání BeginEdit. Vzhledem k tomu, že tuto metodu lze volat vícekrát, je důležité, aby následná volání byla nedestruktivní.

  • ICancelAddNew: Třída, která implementuje rozhraní ICancelAddNew obvykle implementuje IBindingList rozhraní a umožňuje vrátit zpět přidání do zdroje dat pomocí AddNew metody.

  • IEnumerable: Třída, která implementuje rozhraní IEnumerable, je obvykle používána v ASP.NET.

  • ICustomTypeDescriptor: Třída, která implementuje rozhraní ICustomTypeDescriptor poskytuje dynamické informace o sobě. Toto rozhraní se podobá ITypedList, ale používá se spíše pro objekty než seznamy. Toto rozhraní používá DataRowView k promítání schématu podkladových řádků.

    Čtěte také: Modelování interiéru svépomocí

  • IListSource: Třída, která implementuje rozhraní IListSource, umožňuje vazbu na bázi seznamu u objektů, které nejsou seznamem.

  • IRaiseItemChangedEvents: Třída, která implementuje rozhraní IRaiseItemChangedEvents, je seznam, který lze svázat, a také implementuje rozhraní IBindingList. Měli byste implementovat IRaiseItemChangedEvents, pokud zdroj dat poskytuje vlastnost pro výpis převodu událostí, které byly uvedeny výše, a je v interakci s komponentou BindingSource.

Implementace rozhraní pro komponenty

  • ISupportInitialize: Komponenta, která implementuje rozhraní ISupportInitialize, využívá výhod dávkových optimalizací pro nastavení vlastností a inicializaci spolu závislých vlastností.

  • ISupportInitializeNotification: Komponenta, která implementuje rozhraní ISupportInitializeNotification, také implementuje rozhraní ISupportInitialize. Toto rozhraní umožňuje oznámit ostatním komponentám ISupportInitialize, že je inicializace dokončena.

  • INotifyPropertyChanged: Třída, která implementuje toto rozhraní je typ, který vyvolá událost, když se změní některé z jeho hodnot vlastností. Toto rozhraní je navržené tak, aby nahradilo vzor změny události pro každou vlastnost ovládacího prvku.

  • IDataErrorInfo: Třída, která implementuje toto rozhraní, je neovládací komponenta, která podporuje datové vazby.

  • ICurrencyManagerProvider: Třída, která implementuje rozhraní ICurrencyManagerProvider je komponenta, která poskytuje vlastní CurrencyManager pro správu vazeb přidružených k této konkrétní komponentě.

Jednoduchá a složitá vazba

Tradičně se datová vazba používala v aplikacích k využití dat uložených v databázích. Ve Windows Forms můžete vytvořit vazbu na širokou škálu struktur, od jednoduchých objektů (jednoduchá vazba) až po složité seznamy, jako jsou tabulky dat ADO.NET (složitá vazba).

  • Jednoduchá vazba: Pro jednoduchou vazbu windows Forms podporují vazbu na veřejné vlastnosti v jednoduchém objektu. Schopnost ovládacího prvku vytvořit vazbu na jeden datový prvek, například hodnotu ve sloupci v tabulce datové sady. Jednoduchá datová vazba je typická pro ovládací prvky, jako je TextBox nebo Label, které obvykle zobrazují pouze jednu hodnotu. Ve skutečnosti může být jakákoli vlastnost ovládacího prvku svázána s polem v databázi. V sadě Visual Studio je k dispozici rozsáhlá podpora této funkce.

  • Složitá vazba: Vazby modelu Windows Forms založené na seznamech obecně vyžadují, aby objekt podporoval rozhraní IList nebo rozhraní IListSource. Schopnost ovládacího prvku vytvořit vazbu na více než jeden datový prvek, obvykle více než jeden záznam v databázi. Komplexní vazby se také nazývají vazby založené na seznamu. Příklady ovládacích prvků, které podporují komplexní vazbu, jsou ovládací prvky DataGridView, ListBox a ComboBox.

Pro zjednodušení datové vazby windows Forms umožňuje vytvořit vazbu zdroje dat s komponentou BindingSource a poté vytvořit vazbu ovládacích prvků na BindingSource. BindingSource můžete použít ve scénářích jednoduchých nebo složitých vazeb. Obecný vzor použití BindingSource spočívá v vytvoření vazby ovládacích prvků na BindingSource a vytvoření vazby BindingSource ke zdroji dat (například k ADO.NET tabulce dat nebo obchodnímu objektu). BindingSource poskytuje služby, které umožňují a zlepšují úroveň podpory datových vazeb. Například ovládací prvky Windows Forms založené na seznamech, jako je DataGridView a ComboBox, přímo nepodporují vazbu na zdroje dat IEnumerable. Tento scénář však můžete povolit vazbou prostřednictvím BindingSource. Windows Forms podporují navázání vlastností ovládacího prvku na veřejné vlastnosti instance objektu pomocí typu Binding. Aby fungoval jako zdroj dat, musí seznam implementovat rozhraní IList; Jedním z příkladů je pole, které je instancí třídy Array. Obecně platí, že při vytváření seznamů objektů pro datové vazby byste měli použít BindingList<T>. BindingList je obecná verze rozhraní IBindingList.

ADO.NET a datové vazby

ADO.NET poskytuje mnoho datových struktur vhodných pro vazbu.

  • DataColumn: Element DataColumn je základním stavebním blokem DataTable, protože více sloupců tvoří tabulku. Každá DataColumn má vlastnost DataType, která určuje druh dat, která sloupec obsahuje (například značka automobilu v tabulce popisující auta).

  • DataTable: DataTable je reprezentace tabulky s řádky a sloupci v ADO.NET. Tabulka dat obsahuje dvě kolekce: DataColumn, představující sloupce dat v dané tabulce (které nakonec určují druhy dat, které lze do této tabulky zadat) a DataRow, představující řádky dat v dané tabulce. Ovládací prvek můžete složitě svázat s informacemi obsaženými v tabulce dat (například svázat ovládací prvek DataGridView s tabulkou dat).

  • DataView: DataView je přizpůsobené zobrazení jedné tabulky dat, která může být filtrována nebo seřazena. Zobrazení dat je datový snímek používaný komplexními ovládacími prvky.

  • DataSet: DataSet je kolekce tabulek, relací a omezení dat v databázi.

  • DataViewManager: DataViewManager je přizpůsobený pohled na celý DataSet, podobně jako DataView, ale s relacemi zahrnutými.

Běžné scénáře datové vazby

Téměř každá komerční aplikace používá informace čtené ze zdrojů dat jednoho typu nebo jiného, obvykle prostřednictvím datové vazby.

  • Sestavy: Sestavy poskytují flexibilní způsob, jak zobrazit a shrnout data v tištěném dokumentu. Je obvyklé vytvořit sestavu, která tiskne vybraný obsah zdroje dat buď na monitor, nebo na tiskárnu. Mezi běžné sestavy patří seznamy, faktury a souhrny.

  • Formuláře pro zadávání dat: Běžným způsobem, jak zadat velké množství souvisejících dat nebo vyzvat uživatele k zadání informací, je prostřednictvím formuláře pro zadávání dat. Uživatelé mohou zadat informace nebo vybrat volby pomocí textových polí, přepínačů, rozevíracích seznamů a zaškrtávacích políček.

  • Hlavní/podrobná aplikace: Hlavní/podrobná aplikace je jedním formátem pro zobrazení souvisejících dat. Konkrétně existují dvě tabulky dat s relacemi, které se připojují v klasickém obchodním příkladu, tabulka Customers (Zákazníci) a tabulka Orders (Objednávky) s relací mezi nimi, která propojuje zákazníky a jejich objednávky.

  • Vyhledávání tabulek: Dalším běžným scénářem prezentace a manipulace s daty je vyhledávání tabulek. Často se jako součást většího zobrazení dat používá ovládací prvek ComboBox k zobrazení a manipulaci s daty. Klíčem je to, že data zobrazená v ovládacím prvku ComboBox se liší od dat zapsaných do databáze. Pokud máte například ovládací prvek ComboBox zobrazující položky dostupné z obchodu s potravinami, pravděpodobně byste chtěli vidět názvy produktů (chléb, mléko, vejce). Chcete-li však usnadnit načítání informací v databázi a normalizaci databáze, pravděpodobně byste uložili informace pro konkrétní položky dané objednávky jako čísla položek (#501, #603 atd.). Proto existuje implicitní spojení mezi "popisným názvem" položky potravin v ovládacím prvku ve ComboBox formuláři a souvisejícím číslem položky, které je přítomné v objednávce. Je to podstata vyhledávání v tabulce.

Normalizace databáze

S návrhem datové struktury databáze (datového modelu) souvisí pojem normalizace. Pod pojmem normalizace rozumíme proces zjednodušování a optimalizace navržených struktur databázových tabulek. Hlavním cílem je navrhnout databázové tabulky tak, aby obsahovaly minimální počet redundantních dat.

  • První normální forma (1NF): Tabulka je v první normální formě, pokud všechny sloupce (atributy) nelze dále dělit na části nesoucí nějakou informaci neboli prvky musí být atomické. Takto zní oficiální definice normálních forem, v praxi se aplikují první tři, kdy se snažíme v modelu pro každou tabulku definovat primární klíč a sloupce definovat atomicky, tedy tak, aby obsahovaly dále smysluplně nedělitelnou informaci.

Vizualizace datového modelu

Nadefinováním tabulek a vazeb mezi nimi vzniká datový model databáze. Obdélníky odpovídají jednotlivým tabulkám s jejich atributy, čáry pak zobrazují vazby mezi nimi. Podle zakončení čar poznáme řídící tabulku od tabulky dětské, u dětské tabulky je zakončení rozvětvené.

tags: #datové #modelování #vazby #typy

Oblíbené příspěvky: