Autor Zpráva
Spectator
Profil
Snažím se o normalizaci databáze a nejsem si jist tím, jak přesně na tento problém:

Tabulka uživatelů:
--------------------
id_user | jmeno
--------------------

tabulka firem:
----------------------------
id_comp | nazev_firmy
----------------------------

tabulka adres:
---------------------------------
id_adresy | id_u_f | mesto
---------------------------------

Jak odliším v tabulce adres ve sloupci id_u_f uživatele od firmy (id mohou být a budou stejná)?
Rád bych měl na adresy pouze jednu jedinou tabulku. Jak jsem pochopil, tak je to i záměr normalizace. Bohužel netuším, jak se tento problém řeší.
ninja
Profil
Bud přidáte další sloupec, kde bude uvedeno o kterou tabulku se jedná, nebo v případě že se budou adresy dublovat (jedna adresa pro více subjektů), pomocí vazních tabulek jako u klasického M:N spojení.
Spectator
Profil
Je přípustné toto řešení? Vzhledem k duplicitě stejného sloupce ve dvou tabulkách už se nejspíš nejedná o normalizovanou databázi, ale nevím. 1:N
Tabulka uživatelů:
----------------------------------------
id_user | id_adresy | jmeno
----------------------------------------
 
tabulka firem:
--------------------------------------------
id_comp | id_adresy | nazev_firmy
--------------------------------------------
 
tabulka adres:
-------------------------
id_adresy | mesto
-------------------------



Spectator:
vazní tabulky je tedy vhodné udělat pro spojení Firma - Adresa a Uzivatel - Adresa, tedy dvě vazní tabulky pro každé spojení? To mě práve zarazilo, ale vypadá to rozumně.
Keeehi
Profil
Pokud může mít firma jen jednu adresu a člověk také jen jednu adresu, pak to máte správně. Pokud jeden z nich nebo i oba mohou mít více adres, pak to znamená vytvořit vazební tabulku resp. tabulky. I když by se dala udělat jedna vazební tabulka a v ní mít vazby jak firma-adresa tak i uzivatel-adresa, bude lepší to mít ve dvou tabulkách.
Spectator
Profil
Udělal jsem tedy dvě spojové tabulky pro spojení Firma - Adresa a Uzivatel - Adresa.

Nyní zkouším různé dotazy, ale zdají se mi velmi neefektivní.
Příklad: vypsání adresy pro uživatele s ID = 1
SELECT uzivatel.jmeno, adresa.mesto 
FROM uzivatel, adresa, c_uzivatel_adresa
WHERE 
    uzivatel.id = 1
    AND c_uzivatel_adresa.id_uzivatel = uzivatel.id
    AND c_uzivatel_adresa.id_adresa = adresa.id;
 

Pokud mám i další tabulky jako, telefon, adresa, email a pro ně příslušné spojové tabulky, pak se dotaz komplikuje o spoustu podmínek v klauzuli WHERE. Neexistuje nějaký lepší způsob?
YoSarin
Profil
Spectator:
Nebude rychlejší (a přehlednější) tohle?
SELECT u.jmeno, a.mesto
FROM uzivatel u
LEFT JOIN c_uzivatel_adresa c_ua ON c_ua.uzivatel_id = u.id
LEFT JOIN adresa a ON c_ua.adresa_id = a.id
WHERE u.id = 1

Ad další položky - tabulka adresa může obsahovat více sloupečků - kompletní kontakty třeba...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: