Floydoviny

3. září 2008

Normální formy a AJAX

Tvoříte weby? Nebo alespoň jeden? Pak jste určitě narazili na AJAX. Pokud nevíte o čem mluvím, tak dál nečtěte. Možná jste také narazili na "normální formy". Pokud ne a při tom používáte technologie AJAX, tak rozhodně čtěte dál.
Normální formy tady rozhodně nemíním rozebírat. Můžete nechat Google zobrazit stránky s výrazem: normální formy.
Google, je moc pěkný AJAXem poháněný web. Dobře se s ním pracuje.
Proč?
Protože grafika neruší, odezvy jsou vynikající, našeptávač nabízí i počty výsledků, ... Prostě skvělá práce.
Proč nejsou Vaše aplikace taky takové?
Začneme od Adama. Takže klasický příklad, který programovali už všichni. Seznam čísel.

Tabulka by mohla vypadat asi takhle:
Jméno | Příjmení | Číslo
Adam | První | 000000001
Eva | Třetí | 736510007

Proč ta Vaše vypadá:
Jméno a příjmení | Číslo
Adam První | 000000001
Eva Třetí | 736510007

Jasně, dáme dva indexy - jeden na Jméno a příjmení, druhý na Číslo a pošlape to jako hodinky.

Ne, obě tabulky jsou špatně. Použiji citát z root.cz:
1. normální forma (1NF)
Relace (tabulka) je v první normální formě, pokud každý její atribut (sloupec) obsahuje jen atomické hodnoty. Tedy hodnoty z pohledu databáze již dále nedělitelné. Tato podmínka není splněna například u tabulky, kde je jméno a příjmení v jednom sloupci a přitom aplikace pracuje s těmito položkami jako samostatnými.

Co je na tom špatně?
Návrh by mohl vycházet z předpokladu, že přesně víte, co chcete, ale v praxi jsem se s tím nesetkal. Takže pokud nevíme, co vlastně chceme, ale máme k dispozici vstupní data a trochu inteligence, znormalizujeme tabulky. Pěkně je to předvedeno například v článku
Databáze a jazyk SQL.

Tak teď byste měli vědět, jak dostat tabulku do třetí normální formy.

Já bych k tomu doplnil, že moje tabulka by se rozpadla na dvě.
V té první by byly sloupce: IDjméno, Příjmení, Číslo.
V té druhé: IDjméno, Jméno

Proč?
Protože jmen je konečný počet a nemá smysl nechat uživatele zadávat své jméno. Pomůžete mu "našeptávačem", který bude brát jména z databáze, ke které se bude (jak jinak) asynchronně připojovat dle potřeby, tedy na základě vstupu od uživatele.
Já si dokáži představit tabulku s milionem řádků a AJAXový našeptávač, který dělá do této tabulky dotazy:
SELECT * FROM seznam WHERE `Jmeno_a_prijmeni` LIKE '%$vstupoduzivatle%' ORDER BY `Jmeno_a_prijmeni`;

To je ještě ta lepší varianta. MySQL podporuje v dotazech regulární výrazy.
Raději neuvedu příklad, protože bych ho nejpozději do týdne našel použitý ve zdroji nějakého webu.
Můj dotaz by vypadal:
SELECT IDjméno FROM Jmena WHERE `Jméno` LIKE '$vstupoduzivatle%' ORDER BY `Jméno`;


Při představě, že na planetě, je 68404451 tisíc obyvatel (zdroj:
World Population na http://www.ibiblio.org/lunarbin/worldpop ), mě napadlo, jestli by si i sloupec Příjmení nezasloužil vlastní tabulku.

Proč?
Které dotazy děláte nejčastěji? Když nabídnete možnost vybrat si jméno, nebo napsat nové, proč neudělat to samé s příjmením. Uživatel tuto vlastnost podvědomě čeká a pokud mu nebude nabídnuta, bude zklamán. Návštěvníci Vašeho webu nechtějí být zklamáni. Nezapomínejte na to, když děláte web.

Takže máme tři tabulky. Ideální pro AJAXem posílený web, který po zadání prvních pár písmen křestního jména nabízí nalezené tvary a totéž dělá i u dalšího vstupního pole, tedy příjmení.

Pro dnešek stačí.








Počet komentářů: 0:

Přidat komentář

<< Domovská stránka