[Bazy danych] relacje, optymalizacja struktury


(wojmal) #1

Cześć. Mam taki problem z projektem bazy danych. Mianowicie mam tabelę okien (id_o, typ_o, rozmiar itd.) i mam tabelę budynków (id_bud, typ_bud, rok_wyb, itd.) i mam jeszcze tabelę typów budynków, od której zależy ilość okien i ich typ w konkretnym budynku. Maksymalnie może być 64 okna. Zrobiłem więc tak, że tabela typ_budynku ma 64 kolumny i przy każdym typie (altanka_1, altanka_2, bliźniak itd.) niektóre kolumny są zablokowane, bo nie są potrzebne (czyli domyślna NULL lub np. BRAK), a nie które są nie zablokowane i w ich odpowiednikach w tabeli budynek można wpisać odpowiednie okna z tabeli okna. Czy można zrobić to inaczej (ładniej), a jeśli tak to jak? Wystarczy jakaś drobna podpowiedź czego szukać (próbowałem pod zmienna ilość kolumn w tabeli). Z góry dzięki.


(hatezit) #2

A jaka to baza danych? Dobrze by było, jak byś przedstawił swoją bazę w formie diagramu ERD. Tworzyłeś relacje?


(Fizyda) #3

Przy pomocy relacji wiele do wielu.


(Pablo_Wawa) #4

Taka struktura bazy, jaką masz teraz zrobioną, może jest prosta w przygotowaniu, ale na pewno nie elegancka i nie zalecana. I wraz ze zmianą liczby parametrów (typów okien) będziesz musiał modyfikować tabelę i uzupełniać dodatkowe pola. Takie dane o różnych ilościach trzyma się za pomocą osobnej tabeli - stwórz sobie tabelę o nazwie (przykładowo) okna_typu_budynku zawierającej trzy pola:
id (standardowe pole do indeksowania)
id_typ_budynku
id_typ_okna
I teraz tworzysz stosowne rekordy wtedy, kiedy dany typ okna jest w danym typie budynku (to tworzysz rekord dla tej pary).
Takie rozwiązanie jest eleganckie i stosowane powszechnie (np. program Płatnik trzyma uprawnienia użytkowników do różnych spółek za pomocą takich par rekordów id_użytkownika + id_spółki).
Obsługa takich wartości jest nieco bardziej skomplikowana (w zapytaniach SQL być może będziesz musiał używać złączenia JOIN), ale jest elastyczne, bo jak dodasz nowy typ okna, to nic w strukturze tabel nie zmieniasz, a dodajesz tylko te rekordy, dla których masz typ budynku z takim typem okna.


(wojmal) #5

Bardzo Wam dziękuję za odpowiedzi. ERD wygląda tak, miałem problem ze stworzeniem relacji.


(wojmal) #6

Dzięki za odpowiedź. Mam wtedy nową tabele przechowującą powiązania typu budynku z typem okna (no i jeszcze tak naprawdę tabelę typ_okna). W zasadzie ta tabela okna_typu_budynku musiałaby jeszcze przechowywać, które okno w typie budynku jest konkretnego typu (ale to chyba łatwo zrobić dodając pole miejsce_w_budynku). Teraz jeszcze tylko próbuję zrozumieć jak budynkowi (z tabeli budynek) przydzielić okno (z tabeli okna). Czy byłoby to podobnie jak w Twoim poście: tabela okno_w_budynku i cztery pola:
id
id_budynku
miejsce_w_budynku
id_okna
?