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

Ostatní jazyky SQL SQL a databáze Atribut tabulky odkazující na dvě různé entity

Avatar
Lu Kiss
Člen
Avatar
Lu Kiss:

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. srpna 8:22
Avatar
Odpovídá na Lu Kiss
Michal Štěpánek:

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. srpna 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:

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

 
Nahoru Odpovědět 8. srpna 11:41
Avatar
Odpovídá na Lu Kiss
Michal Štěpánek:

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. srpna 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:

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. srpna 17:02
Avatar
Odpovídá na Lu Kiss
Michal Štěpánek:

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. srpna 5:57
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
coells
Redaktor
Avatar
Odpovídá na Lu Kiss
coells:

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  +1 9. srpna 9:49
Avatar
Lu Kiss
Člen
Avatar
Odpovídá na coells
Lu Kiss:

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. srpna 8:25
Avatar
Kubba
Člen
Avatar
Kubba:

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. srpna 20:19
Avatar
Vlado Cukalovsky:

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

 
Nahoru Odpovědět  +1 28. srpna 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.