Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Projektowanie bazy danych - problem
Forum PHP.pl > Forum > Bazy danych > MySQL
vadergb
Witam,

Projektujac baze danych natrafilem na pewien problem.

Mam tak:
zdjecia uzytkownikow
zdjecia do albumow
zdjecia do grup

i teraz pytanie utworzyc to w jednej tabeli z polami:
id_zdjecia | zdjecie | opis | glowne | id_kategorii | typ

i teraz id_kategori to id uzytkownika, albumu lub grupy.
Zas w polu typ podajemy 1=> zdjecia uzytkownika, 2=> zdjecia albumu, 3=> zdjecia grupy.

potem do tego dochodzi tabela "osoby na zdjeciu"
id | id_osoby | photo_id


Czy zaprojektowanie tak tego jest lepszym sposobem niz:

tworzymy 3 tabele ze zdjeciami:
id_zdjecia | zdjecie | opis | glowne | id_albumu
id_zdjecia | zdjecie | opis | glowne | id_uzytkownika
id_zdjecia | zdjecie | opis | glowne | id_grupy

i totem z "osoby na zdjeciu" tak samo czy tworzymy jedna tabele:
id | id_osoby | photo_id | typ
czy:
id | id_osoby | photo_user_id
id | id_osoby | photo_album_id
id | id_osoby | photo_grupy_id




Prosze sie nie czepiac nazewnictwa pol itp. - to jest przykladowe.

Z gory dziekuje za pomoc z tym problemem ... Nigdzie nei znalazlem jak to powinienem wykonac .



thek
Bazę zawsze projektuje się tak, by jak najmniej danych się dublowało. Pomysł z dołączeniem pola typ nie uważam za dobry z prostej przyczyny:a co jeśli zdjęcie będzie musiało zostać dołączone do albumu i do grupy lub jeszcze i użytkowników? Tego typu "drobiazgi" załatwia się nieco inaczej. Tworzysz tabelę zdjęć i informacji o nich. Potem drugą, która przechowuje info o tym gdzie zdjęcie o konkretnym id jest przechowywane. Czyli druga tabela ma pola: id_zdjecia, typ, numer(default = 0). Typ ustalamy na 1 - użytkownicy, 2 - albumy, 3 - grupy. Numer domyślnie będzie 0, ale będzie mógł otrzymać i przechowywać informacje o numerze albumy lub grupy jakiej tyczy, ewentualnie numerze grupy w użytkownikach (jeśli będzie podział na grupy użytkowników). Dzięki temu bez konieczności dublowania informacji będzie można zawrzeć informację, że zdjęcie o id X znajduje się w albumie Y i jednocześnie w grupie Z. Wszystko za sprawą 2 rekordów w tej tablicy z parametrami (X, 2, Y) oraz (X, 3, Z) smile.gif Jeśli chodzi o to kto jest na zdjęciu to przecież wpis tyczy jednego zdjęcia i sens umieszczania informacji gdzie to zdjęcie jest żaden. Ostatecznie więc masz tabele:

Zdjęcie: id, opis, zdjęcie(url lub nazwa?)
Przynależność: id_zdjęcia, typ, numer
Userzy_na_fotce: id_fotki, id_osoby
Grupy: id, nazwa, opis
Albumy: id, nazwa, opis
(opcjonalnie) Grupy_userów: id, nazwa, opis
(jeśli istnieją Grupy_userów) Przynależność_usera: id_usera, id_grupy

Dlaczego tak? Gdy masz grupy, albumy (i grupy userów) to nie widzę sensu jeszcze dodatkowo zakładać kategorii. Kategorią jest przecież przynależność do określonego typu i/lub o określonym numerze. Dzięki temu mżemy wyciągnąć informacje gdzie dana fotka przynależy, kto jest na konkretnej fotce lub na jakich zdjęciach jest konkretny user. Wszystko się da wyciągnąć z bazy ładnie odpowiednim użyciem JOIN. Oczywiście ja naszkicowałem tylko szablon z grubsza. Można to zawsze jeszcze nieco przebudować.
vadergb
Cytat(thek @ 6.09.2009, 02:01:06 ) *
Bazę zawsze projektuje się tak, by jak najmniej danych się dublowało. Pomysł z dołączeniem pola typ nie uważam za dobry z prostej przyczyny:a co jeśli zdjęcie będzie musiało zostać dołączone do albumu i do grupy lub jeszcze i użytkowników? Tego typu "drobiazgi" załatwia się nieco inaczej. Tworzysz tabelę zdjęć i informacji o nich. Potem drugą, która przechowuje info o tym gdzie zdjęcie o konkretnym id jest przechowywane. Czyli druga tabela ma pola: id_zdjecia, typ, numer(default = 0). Typ ustalamy na 1 - użytkownicy, 2 - albumy, 3 - grupy. Numer domyślnie będzie 0, ale będzie mógł otrzymać i przechowywać informacje o numerze albumy lub grupy jakiej tyczy, ewentualnie numerze grupy w użytkownikach (jeśli będzie podział na grupy użytkowników). Dzięki temu bez konieczności dublowania informacji będzie można zawrzeć informację, że zdjęcie o id X znajduje się w albumie Y i jednocześnie w grupie Z. Wszystko za sprawą 2 rekordów w tej tablicy z parametrami (X, 2, Y) oraz (X, 3, Z) smile.gif Jeśli chodzi o to kto jest na zdjęciu to przecież wpis tyczy jednego zdjęcia i sens umieszczania informacji gdzie to zdjęcie jest żaden. Ostatecznie więc masz tabele:

Zdjęcie: id, opis, zdjęcie(url lub nazwa?)
Przynależność: id_zdjęcia, typ, numer
Userzy_na_fotce: id_fotki, id_osoby
Grupy: id, nazwa, opis
Albumy: id, nazwa, opis
(opcjonalnie) Grupy_userów: id, nazwa, opis
(jeśli istnieją Grupy_userów) Przynależność_usera: id_usera, id_grupy

Dlaczego tak? Gdy masz grupy, albumy (i grupy userów) to nie widzę sensu jeszcze dodatkowo zakładać kategorii. Kategorią jest przecież przynależność do określonego typu i/lub o określonym numerze. Dzięki temu mżemy wyciągnąć informacje gdzie dana fotka przynależy, kto jest na konkretnej fotce lub na jakich zdjęciach jest konkretny user. Wszystko się da wyciągnąć z bazy ładnie odpowiednim użyciem JOIN. Oczywiście ja naszkicowałem tylko szablon z grubsza. Można to zawsze jeszcze nieco przebudować.


Dzieki za pomoc winksmiley.jpg w sumie takiej odpowiedzi szukalem ;]

ze tez na to sam nie wpadlem (?) biggrin.gif

pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.