Autor | Zpráva | ||
---|---|---|---|
Spectator Profil |
#1 · Zasláno: 23. 1. 2012, 11:49:06
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 |
#2 · Zasláno: 23. 1. 2012, 11:56:33
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 |
#4 · Zasláno: 23. 1. 2012, 13:39:37
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 |
#5 · Zasláno: 23. 1. 2012, 14:20:09
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 |
#6 · Zasláno: 23. 1. 2012, 14:32:40
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... |
||
Časová prodleva: 12 let
|
0