NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Atribut tabulky odkazující na dvě různé entity

V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Lu Kiss
Člen
Avatar
Lu Kiss:8.8.2016 8:22

Ahoj, tvořím jeden IS a narazil jsem již při tvorbě databáze na menší problém. Mám tabulku závad a ta má jako jeden atribut "výrobek/služba". Výrobek je hw věc (routery, klávesnice, ...) a služba sw (IotApp, ... ) tyto dvě tabulky již existují, jsou naplněné několika záznamy, tudíž je není možno měnit. Pokud tedy chci do tabulky závad připojovat hodnoty z výrobků a služeb, musí to být vytvořeno jako dva samostatné sloupce, s tím že můžou být null (lépe však, že jenom jeden může být null) nebo to lze nějak jinak? Děkuji

 
Odpovědět
8.8.2016 8:22
Avatar
Odpovídá na Lu Kiss
Michal Štěpánek:8.8.2016 9:39

do toho sloupce, kterého se ten daný záznam netýká (u služby je to sloupec výrobek a opačně) můžeš přeci při ukládání záznamu dávat nulu, nebo ne?

Nahoru Odpovědět
8.8.2016 9:39
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Lu Kiss
Člen
Avatar
Odpovídá na Michal Štěpánek
Lu Kiss:8.8.2016 11:41

tak to zatím mám navržené, ale ptám se zda to jde udělat jinak :)

 
Nahoru Odpovědět
8.8.2016 11:41
Avatar
Odpovídá na Lu Kiss
Michal Štěpánek:8.8.2016 12:03

Ještě by to šlo dělat ve stejném sloupci (ty IDčka služeb a výrobků) a v jiném sloupci nějaký atribut, který by odlišoval, zda se jedná o službu či výrobek.

Nahoru Odpovědět
8.8.2016 12:03
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Lu Kiss
Člen
Avatar
Odpovídá na Michal Štěpánek
Lu Kiss:8.8.2016 17:02

to mi nepříjde tak rozumné, ale myšlenka to je zajímavá, nechám to přes ty dva sloupce s tím že jeden bude null

 
Nahoru Odpovědět
8.8.2016 17:02
Avatar
Odpovídá na Lu Kiss
Michal Štěpánek:9.8.2016 5:57

Když tak nad tím přemýšlím, zdá se mi ta druhá varianta lepší, protože se pak dá použít stejný dotaz i na službu i na výrobek jen s použitím parametru, protože to IDčko bude v tom samém sloupci. Když použiješ dva sloupce (IDvyrobek a IDsluzba) musíš použít pro získání jednoho nebo druhého dva dotazy...

Nahoru Odpovědět
9.8.2016 5:57
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
coells
Tvůrce
Avatar
Odpovídá na Lu Kiss
coells:9.8.2016 9:49

S největší pravděpodobností porušuješ 3. nebo 4. normální formu a máš funkční závislosti mezi neprimárními atributy, takže to není správný design.
To, co radí Michal, je ke všemu jasné porušení 3NF, protože atribut identifikuje typ neprimárního klíče.

A teď, proč je ten design špatně, a jak to můžeš vidět lépe?
Představ si, že místo dvou typů závady (hw, sw) máš typů deset (hw, sw, apple, samsung, ms, abc, def, ...).
Pak budeš mít tabulku s deseti exkluzivními sloupci, kdy jen jeden z nich může být non-null.
Tady už je jasně vidět, kde je problém.

Řešení?
Místo reference v tabulce závada budeš mít další dvě tabulky: ZV(závada, výrobek) a ZS(závada, služba).
Dotazy na všechny závady pak můžeš řešit připraveným pohledem přes sjednocení na sigma-algebře (UNION ALL).

Trochu pragmatičtější přístup potom je nechat to tak, jak to máš.
Je to sice špatně, ale stejně budeš mít jen malou databázi a ORM knihovna tě dokáže vytáhnout z těch sraček, do kterých se dostaneš.
Databáze většinou ustojí hodně a knihovny to schovají.
Jestli čekáš, že databáze bude větší (miliony až desítky milionů záznamů), tak se radši poraď s někým zkušenějším.

 
Nahoru Odpovědět
9.8.2016 9:49
Avatar
Lu Kiss
Člen
Avatar
Odpovídá na coells
Lu Kiss:10.8.2016 8:25

To zní rozumně jako ty dvě tabulky, akorát když ta závada má asi 10 atributů.. Aplikaci píšu v Nette. Další tabulky typu závad určitě nepřijde. Záznamů v hw je kolem 10 000, služby do stovky.
A teď mě ještě napadá, v aplikaci pak chci mít vyhledávací okno, které bude vyhledávat a napovídat všechny názvy z tabulky sw (služba) a hw (výrobek), takže i tady se bude ten pohled hodit.

 
Nahoru Odpovědět
10.8.2016 8:25
Avatar
Kubba
Člen
Avatar
Kubba:27.8.2016 20:19

Ahoj, řeším podobný problém. Akorát místo 2 sloupečků mám 3 a vždy maximálně jeden může byt nenulový. Moc se mi nelíbí ani řešení, že nechám sloupečky jako cizí klíče s možností null a ani mít více stejných tabulek lišících se pouze v jednom sloupci (V mém případě 4 tabulky - jednu bez reference a pak ty 3). Kdybys přišel na nějaké elegantní řešení tak ho sem postni :D.

To coells: Hele to v praxi vážně máš třeba 10 různých tabulek s x stejnými sloupci a jedním který se liší ??

 
Nahoru Odpovědět
27.8.2016 20:19
Avatar
Vlado Cukalovsky:28.8.2016 14:28

Mňa v rýchlosti napadlo niečo takéto.

 
Nahoru Odpovědět
28.8.2016 14:28
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.