Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dylematy z wydajnością
Forum PHP.pl > Forum > Bazy danych
Vasquez21
Witam.

Mam pytanie co do rozplanowania bazy danych w sklepie.

Mam wątpliwości co do rozwiązania które wymyśliłem tak więc chciałbym spytać o radę.

Załóżmy że mam 3 tabele.
- produkty (zawiera oczywiście produkty)
- kategorie (zawiera oczywiście kategorie)
- pro_kat (łączy obie tabele, tak by do kilku kategorii można było przypasować jeden produkt)

Wymyśliłem sobie, że będę przechowywał w "pro_kat", wyłącznie wpisy wtedy kiedy dany produkt należy do jakiejs kategorii. Nie chciałem mieć sytuacji, że dodaję jakis produkt i mam np. 100 kategorii to nagle pojawia mi sie w tabeli łączącej pro_kat, 100 wpisów z informacją że dany produkt należy lub nie należy (1/0) do danej kategorii.

Później jednak w panelu chciałem sobie zrobić coś takiego, że jak wybieram dany produkt to mogę edytować jego kategorie, otwiera mi się nowe okno, ładowane są wszystkie kategorie z bazy danych i zależnie od uprawnień pojawiają się butony "radio" z zaznaczonym tak lub nie.

Jedyne co mi przyszło do głowy wtedy to puścić wtedy jedną pętlę która będzie jechała po wszystkich kategoriach i drugą która za każdym razem wysyła zapytanie do BD, czy dany wpis tam jest. Tak sobie pomyślałem jednak że to będzie bardzo dużo zapytań. Dodatkowo po zaznaczeniu i wybraniu nowych kategorii znów mam dwie możliwości: albo najpierw wszystkie należące do danego wpisy usunąć i później zrobić inserty, albo sprawdzać czy dany wpis już istnieje i jeśli tak to UPDATE, jeśli nie to insert... Wydaje mi się że pierwsze rozwiązanie jest jednak dużo szybsze.

Oczywiście gdybym przechowywał wszystkie wpisy w pro_kat, to zrobiłbym poprostu update wszystkich pól.

Bardzo proszę o jakieś sugestie i ewentualne uwagi który kierunek powinnienem wybrać.
dr_bonzo
1. To sie da jednym SQLem zrobic (wybrac kategorie nieprzypisane do produktu przy relacji wiele do wielu), do tego UNION z juz przypisanymi kategoriami, jakis znacznik okreslajacy czy kategoria jest przypisana i do petli wypisujacej:


Ten sql (tylko nieprzypisane):
Cytat
SELECT permissions.*
FROM permissions
WHERE NOT EXISTS ( SELECT * FROM employee_groups_permissions egp WHERE egp.permission_id = permissions.id AND egp.employee_group_id = $ID_grupy ) ORDER BY permissions.name ASC


masz permissions i grupy zwiazane relacja wiele do wielu (tabela employee_groups_permissions)


2.
Cytat
Dodatkowo po zaznaczeniu i wybraniu nowych kategorii znów mam dwie możliwości: albo najpierw wszystkie należące do danego wpisy usunąć i później zrobić inserty,

i wrzuc to w transakcje.

Mozesz tez zalozyc UNIQUE index na (produkt_id, kategoria_id) tak ze nie pozwoli ci dodac przypisania kategorii ponownie.
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.