Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rozwiązanie często spotykanego problemu
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
Skobi
Mam pytanie dotyczace czesto spotykanego problemu, a dokladniej mowiac chodzi o statusty
przechowywane w bazie danych, czyli:

Załóżmy, że nasza baza danych przechowuje informacje o sklepie, produktach i kategorii.
Baza danych mogłaby wyglądać tak:

  1. CREATE TABLE sklep
  2. (
  3. id_sklep serial NOT NULL,
  4. nazwa varchar(255) NOT NULL CHECK(nazwa!=''),
  5. archiwum integer NOT NULL CHECK(archiwum=0 OR archiwum=1),
  6. constraint sklep_id_sklep PRIMARY KEY(id_sklep)
  7. );
  8.  
  9. CREATE TABLE kategoria
  10. (
  11. id_kategoria serial NOT NULL,
  12. nazwa varchar(255) NOT NULL CHECK(nazwa!=''),
  13. archiwum integer NOT NULL CHECK(archiwum=0 OR archiwum=1),
  14. constraint kategoria_id_kategoria PRIMARY KEY(id_kategoria)
  15. )
  16.  
  17. CREATE TABLE produkt
  18. (
  19. id_produkt serial NOT NULL,
  20. id_sklep integer NOT NULL,
  21. id_kategoria integer NOT NULL,
  22. nazwa varchar(255) NOT NULL CHECK(nazwa!=''),
  23. archiwum integer NOT NULL CHECK(archiwum=0 OR archiwum=1),
  24. constraint produkt_id_produkt PRIMARY KEY(id_produkt),
  25. constraint produkt_id_sklep FOREIGN KEY(id_sklep) REFERENCES sklep(id_sklep),
  26. constraint produkt_id_kategoria FOREIGN KEY(id_kategoria) REFERENCES kategoria(id_kategoria)
  27. )



i teraz w naszej bazie znajduja sie przykładowe informacje:


tabela sklep:
1|sklep test1|0
2|sklep test2|0
3|sklep test3|1

tabela kategoria:
1|RTV|0
2|AGD|1

tabela produkt:
1|1|1|TV Sony|0
2|2|2|Zmywarka Electrolux|1


i teraz załóżmy, że chcemy wyciągnąć z bazy danych informacje o produktach, sklepie w ktorym dany
produkt istnieje i kategorii do ktorej jest przypisany. Oczywiście interesuja nas wszystkie aktywne
produkty czyli ( archiwum=0 ).

Oto przykładowe zapytanie:


  1. SELECT
  2. s.nazwa, p.nazwa, k.nazwa
  3. FROM produkt p INNER JOIN sklep s ON p.id_sklep = s.id_sklep AND s.archiwum = 0
  4. INNER JOIN kategoria k ON p.id_kategoria = k.id_kategoria AND k.archiwum = 0
  5. WHERE p.archiwum = 0;


i teraz widzimy, że aby wyciągnąć informacje o produktach niearchiwalnych
w kazdym zapytaniu musimy dodawać archiwum=0. Jest to dość żmudna praca,
którą musimy wykonywać prawie w każdym zapytaniu, a zapytan do bazy w przykladowym
systemie może być wiele ( w zależności od wielkości systemu ).

Do tego dochodzi problem kiedy w juz dzialajacym systemie musimy dodac jeszcze inny status
( np. aktywny = 0, aktywny =1 ) i wtedy każde zapytanie kierowane do bazy musi uwzgledniac
ten status ( czyli kilkadziesiat zapytan musi zostac zmienionych )

Moje pytanie brzmi jak Wy sobie radzicie z takimi problemami i jak jest Wasza
implementacja takich rozwiązań?

Mój pomysł na to rozwiązanie to tworzenie widoków czyli np.:

  1. CREATE VIEW akt_sklep AS SELECT * FROM sklep WHERE archiwum = 0;


i w każdym zapytaniu wyciągającym dane odnoszenie sie do tego widoku.

Czy według Was jest to dobra praktyka?
SongoQ
Widok ma odzwierciedlac pewna funkcjonalnosc i zmiana jednej opcji w nim ma zmodyfikowac dzialanie wszystkich zapytan ktore odwoluja sie do tego widoku. Jesli masz status dodatkowy i w innym miejscu wyciagany to dokladasz inny widok. Jesli masz zapytanie gdzie jest wiele statusow to w widoku pomijasz status.

W widoku robie sobie wszystkie zlaczenia wtedy zapytanie do widoku jest czytelniejsze.
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.