netcoffee.pl*po godzinach - reaktywacja

Ten blog jest kontynuacją bloga dostępnego ongiś pod adresem netcoffee.pl/pogodzinach.
Artykuły, które na to zasługują są przenoszone do nowej wersji bloga. Pozostałe wkrótce znikną.

2005-10-30

Nie duplikuj informacji w bazie

Jedna z istotnych cech relacyjnych baz danych jest to, ze mozna przechowywane w nich informacje powiazac ze soba. Nie ma wiec koniecznosci duplikowania informacji zawartych w bazie.

Dla przykladu wezmy pod uwage system zawierajacy konta uzytkownikow, ktore mozna dowolnie przypisywac do grup. Istnieje takze mozliwosc wyslania wiadomosci e-mail do wybranej grupy.

Uproszczona struktura bazy danych to:
Tabela 'uzytkownik':
  • id
  • login
  • email
Tabela 'grupa':
  • id
  • nazwa

W bazie danych znajduje sie jeszcze jedna tabela - zawiera ona informacje o przynaleznosci poszczegolnych uzytkownikow do grup.
Blednie zaprojektowana tabela bedzie wygladac nastepujaco:
Tabela 'uzytkownik_grupa':
  • grupa_id
  • uzytkownik_id
  • email
W zalozeniu, aby pobrac adresy e-mail uzytkownikow nalezacych do grupy o id = 7, wystarczy wywolac zapytanie:
SELECT email FROM uzytkownik_grupa WHERE grupa_id = 7
Niestety, takie rozwiazanie ma powazne wady:
  • informacja o adresie e-mail uzytkownika jest zduplikowana - podczas jej uaktualniania, nalezy ja zmienic w dwoch tabelach
  • dane niepotrzebnie znajduja sie w drugiej tabeli - przez to zwieksza sie objetosc bazy danych

Rozwiazaniem probemu, jest zmiana struktury tabeli 'uzytkownik_grupa':
  • grupa_id
  • uzytkownik_id
oraz zmiana sposobu pobierania adresow e-mail:
SELECT u.email FROM uzytkownik as u, uzytkownik_grupa as ug WHERE u.id = ug.uzytkownik_id AND ug.grupa_id = 7

Takie rozwiazanie pozwala na redukcje ilosci zapytan do bazy danych w momencie aktualizacji adresu. Zapewnia takze, ze dane pobierane z bazy beda zawsze aktualne. Zmniejsza sie takze objetosc plikow z danymi w bazie - dzieki temu moze wzrosnac jej wydajnosc.

No comments:

Post a Comment