Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak przechowywac dane (powtarzalne)?
Forum PHP.pl > Forum > Bazy danych > MySQL
mxm
Witam!!

Chciałbym się zapytać jak przechowywać dane w Bazie MySQL.

Powiedzmy ze robię sobie baze z filmami np. do katalogowania włąsnych zbiorów płyt. Budowanie skryptu ma na celu czeste wyszukiwanie pozycji wg różnorodnych kryteriów (więc musi to być wydajna metoda przy tak dużych danych).

Mam formularz, w którym wypełnia się formularz. Większość danych jest prosta do wprowadzenia. Ale...

Problem 1: Jak przechowywać gatunki filmowe?questionmark.gif Można co prawda zrobić serialize i wrzucic do bazy ciag ale wtedy wyszukiwanie byłoby mało skuteczne (zwłaszcza wyszukiwanie wg kilku gatunków). Tak więc najlepiej jakby wszystko było w bazie i tam zapytaniem mozna było sobie wyciagnac liste z tytułami o podanych kryteriach. Tak wiec mam to przekazywac np.
- w postaci ciagu: 'Akcja, Dramat, Przygodowy' (tak mam obecnie w bazie)
- w postaci jakiś kodów np. '#01:#04:#23'
- czy może jakoś inaczej winksmiley.jpg

Problem 2: Teraz w osobnej tabeli chciałbym dołączyć informacje o nośniku (np. DVD). Jest tam dość skompikowane wprowadzenie z formularza scieżki dźwiekowej (jest kilka ścieżek dźwiękowych w oryginalnym DVD). Chcąc je wszystki uwzględnić trzeba prowadzić dla POJEDYŃCZEJ ścieżki dźwiekwoej takie informacje jak rodzaj kodowania (DD 5.1, DD 2.0, DTS), a następnie język (Polski Lektor, Angielski). Na każdej płycie może być dowolna ilość ścieżek od 1 do 6. Jak to wprowadzać do bazy??
- Jako pełne nazwy w postaci ciągu np. 'DD 5.1 Angielski, DD 2.0 Polski Lektor'
- czy jakoś inaczej, może bardziej wydajniej?questionmark.gif

Przedstawione przykłady to jakby tabela w tabeli tylko ze MySQL nie obsługuje pól jako tablice winksmiley.jpg A umieszcenie tego w osobnych wierszach nie ma sensu. Ma ktoś jakieś własne przemyślenia lub doświadczenia??
webdice
Ad 1. Zrób sobie tabele np. gatunki o takiej strukturze.

Kod
id_filmu, id_gatunku


Ad 2. Nie do końca zrozumiałem, ale raczej będzie podobnie.
mxm
Dane dla pojedynczego tytułu są przechowywane w JEDNYM WIERSZU. Jak ma pole np. 'gatunki' to co mam tam wpisać?? To jest ten główny problem smile.gif Każdy gatunek może mieć kilka pozycji przecież winksmiley.jpg
webdice
Przykładowo:

Kod
1. Tytuł: Film1, Opis: Opis dla filmu pierwszego1, Czas trwania: 01:03:23, Gatunek: komedia, dokumentalny
2. Tytuł: Film2, Opis: Opis dla filmu pierwszego2, Czas trwania: 02:05:31, Gatunek: tragedia, dramat, komedia


Tabela filmy:

Kod
id:1, title:Film1, description:Opis dla filmu pierwszego1, time:01:03:23
id:2, title:Film2, description:Opis dla filmu pierwszego2, time:02:05:31


I np. komedia id: 1, dokumentalnyid: 2, tragedia id: 3, dramat id: 4 (te dane możesz trzymać również w tabeli).

Tabela wiążąca filmy z gatunkami:

Kod
id_filmu:1, id_gatunku: 1
id_filmu:1, id_gatunku: 2
id_filmu:2, id_gatunku: 3
id_filmu:2, id_gatunku: 4
id_filmu:2, id_gatunku: 1
mxm
Właśnie snuje przemyślenia na ten temat i dochodze do wniosków, że jeśli tabela łącząca ID_filmu z ID_gatunku 'tabela_gatunki' będzie strasznie duża (chodzi o ilość rekordów; wierszy).

Powiedzmy ze mam 500 tytułów (500 x ID_filmu). Teraz w 'tabela_gatunki' zakłądając ze każdy film ma nie mniej niż 3 lub 4 gatunki stwierdzam ze długość 'tabela_gatunki' to jakieś 500 x 4 = 2000 rekordów. Czy to trochę nie zaśmieca bazy?? biggrin.gif
webdice
Co to jest 2000 rekordów? smile.gif
mxm
mi chodzi wydajność bazy. Przeszukiwanie tego będzie dłuższe a przy większej ilości filmów spowoduje duże obciążenie dla bazy przy wyszukiwaniu kilku gatunków naraz... Przeciez te dane sa powtarzalne wiec po co przydzielac po klika wierszy garunku dla jednego filmu??
webdice
Szukasz po gatunku, czyli zapytanie:

  1. SELECT * FROM `gatunki` WHERE `id_gatunku` = 1 AND ...


Jeśli razem z filmami to JOIN i nie będzie problemów. Zresztą porób sobie testy.
mxm
O zapytanie to ja się nie martwie. Chodzi mi tylko czy przy duzej ilosci danych oraz dużej ilości gatunków dla pojedynczego filmu ta tabela w bazie MySQL będzie działała wydajnie?questionmark.gif
kitol
Proponuję tabelę gatunki: id_gatunku INT, gatunek VARCHAR
oraz tabelę gatunki_filmy: id_gatunku INT, id_filmu INT

Tabela gatunki ma kilkanaście wierszy, tabela gatunki_filmy ma więcej wierszy niż tabela filmy ale dla bazy danych to nie jest problem.

sorki nie doczytałem to rozwiązanie zaproponował już webdicepl
mxm
Właśnie zastosowałem to rozwiązanie w mojej bazie. Jednak nie mogę wykonać żadnego indexowania, ponieważ ID_film i ID_gatunek powtarzaja sie w wielu wierszach. Czy bedzie mialo to wpływ na przeszukiwanie tej tabeli przy duzej liczbie rekordów?questionmark.gif
kitol
ID_Film i ID_gatunek nie mogą się powtarzac. Jedno ID_film odpowiada jednemu filmowi i inny film mnie może mieć tego samego. Podobnie z ID_gatunek. Powinieneś mieć 3 tabele:

  1. filmy:
  2. ID_film Nazwa inne kolumny
  3. 1        Forrest Gump
  4. 2        Powrót do przyszłości
  5. 3        Shrek
  6.  
  7. gatunki:
  8. ID_gatunek Gatunek
  9. 1               komedia
  10. 2               wojenny
  11. 3               historyczny
  12. 4               dramat
  13. 5               animowany
  14. 6               SF
  15.  
  16. oraz filmy_gatunki
  17. ID_film ID_gatunek
  18. 1         2
  19. 1         3
  20. 1         4
  21. 2         1
  22. 2         6
  23. 3         1
  24. 3         5


Masz tu relację n:n (wiele do wielu). Czyli jeden film może być zaliczany do wielu gatunków. I każdy gatunek może odpowiadać wielu filmom. Taką relację zapisuje się w 3 tabelach. Klucze główne ustawiasz tylko w tabelach filmy i gatunaki. Tabela je ł
cząca nie może mieć kluczy unikalnych, a jedynie zwykłe indeksy (by przyspieszyć
wyszukiwanie i sortowanie)
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.