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:
CREATE TABLE sklep ( id_sklep serial NOT NULL, nazwa varchar(255) NOT NULL CHECK(nazwa!=''), archiwum integer NOT NULL CHECK(archiwum=0 OR archiwum=1), constraint sklep_id_sklep PRIMARY KEY(id_sklep) ); CREATE TABLE kategoria ( id_kategoria serial NOT NULL, nazwa varchar(255) NOT NULL CHECK(nazwa!=''), archiwum integer NOT NULL CHECK(archiwum=0 OR archiwum=1), constraint kategoria_id_kategoria PRIMARY KEY(id_kategoria) ) CREATE TABLE produkt ( id_produkt serial NOT NULL, id_sklep integer NOT NULL, id_kategoria integer NOT NULL, nazwa varchar(255) NOT NULL CHECK(nazwa!=''), archiwum integer NOT NULL CHECK(archiwum=0 OR archiwum=1), constraint produkt_id_produkt PRIMARY KEY(id_produkt), constraint produkt_id_sklep FOREIGN KEY(id_sklep) REFERENCES sklep(id_sklep), constraint produkt_id_kategoria FOREIGN KEY(id_kategoria) REFERENCES kategoria(id_kategoria) )
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:
SELECT s.nazwa, p.nazwa, k.nazwa FROM produkt p INNER JOIN sklep s ON p.id_sklep = s.id_sklep AND s.archiwum = 0 INNER JOIN kategoria k ON p.id_kategoria = k.id_kategoria AND k.archiwum = 0 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.:
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?