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í
IListmůže býtArray,ArrayListneboCollectionBase. Jedná se o indexované seznamy položek typuObjecta 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í
IBindingListposkytuje 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 vlastnostListChangedTypeparametruListChangedEventArgs. 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
IBindingListViewrozhraní poskytuje všechny funkce implementaceIBindingList, 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 podporujeBeginEdit,EndEditaCancelEditmetody, které umožňují vrátit zpět změny provedené v objektu. MetodaBeginEditsignalizuje začátek úpravy objektu. Objekt, který implementuje toto rozhraní, bude muset uložit všechny aktualizace po volání metodyBeginEditzpůsobem, aby aktualizace lze zahodit, pokud je volána metodaCancelEdit. V datové vazbě Windows Forms můžete volatBeginEditvícekrát v rámci jedné transakce úprav (napříkladBeginEdit,BeginEdit,EndEdit). ImplementaceIEditableObjectby měly kontrolovat, zda již bylBeginEditvolá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í
ICancelAddNewobvykle implementujeIBindingListrozhraní a umožňuje vrátit zpět přidání do zdroje dat pomocíAddNewmetody.IEnumerable: Třída, která implementuje rozhraní
IEnumerable, je obvykle používána v ASP.NET.ICustomTypeDescriptor: Třída, která implementuje rozhraní
ICustomTypeDescriptorposkytuje dynamické informace o sobě. Toto rozhraní se podobáITypedList, ale používá se spíše pro objekty než seznamy. Toto rozhraní používáDataRowViewk 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 implementovatIRaiseItemChangedEvents, pokud zdroj dat poskytuje vlastnost pro výpis převodu událostí, které byly uvedeny výše, a je v interakci s komponentouBindingSource.
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ámISupportInitialize, ž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í
ICurrencyManagerProviderje komponenta, která poskytuje vlastníCurrencyManagerpro 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
TextBoxneboLabel, 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í
IListnebo 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í prvkyDataGridView,ListBoxaComboBox.
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
DataColumnje základním stavebním blokemDataTable, protože více sloupců tvoří tabulku. KaždáDataColumnmá vlastnostDataType, která určuje druh dat, která sloupec obsahuje (například značka automobilu v tabulce popisující auta).DataTable:
DataTableje 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) aDataRow, 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í prvekDataGridViews tabulkou dat).DataView:
DataViewje 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:
DataSetje kolekce tabulek, relací a omezení dat v databázi.DataViewManager:
DataViewManagerje přizpůsobený pohled na celýDataSet, podobně jakoDataView, 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
ComboBoxk zobrazení a manipulaci s daty. Klíčem je to, že data zobrazená v ovládacím prvkuComboBoxse liší od dat zapsaných do databáze. Pokud máte například ovládací prvekComboBoxzobrazují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 veComboBoxformulář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
