Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak przechowywac dane (powtarzalne)?, Chodzi o przechowywanie danych np. z tablicy...
mxm
post
Post #1





Grupa: Zarejestrowani
Postów: 46
Pomógł: 1
Dołączył: 9.06.2005

Ostrzeżenie: (0%)
-----


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??
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
webdice
post
Post #2


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




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.
Go to the top of the page
+Quote Post
mxm
post
Post #3





Grupa: Zarejestrowani
Postów: 46
Pomógł: 1
Dołączył: 9.06.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
webdice
post
Post #4


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




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
Go to the top of the page
+Quote Post
mxm
post
Post #5





Grupa: Zarejestrowani
Postów: 46
Pomógł: 1
Dołączył: 9.06.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
webdice
post
Post #6


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Co to jest 2000 rekordów? smile.gif
Go to the top of the page
+Quote Post
mxm
post
Post #7





Grupa: Zarejestrowani
Postów: 46
Pomógł: 1
Dołączył: 9.06.2005

Ostrzeżenie: (0%)
-----


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??

Ten post edytował mxm 2.02.2008, 12:35:05
Go to the top of the page
+Quote Post
webdice
post
Post #8


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




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.
Go to the top of the page
+Quote Post
mxm
post
Post #9





Grupa: Zarejestrowani
Postów: 46
Pomógł: 1
Dołączył: 9.06.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
kitol
post
Post #10





Grupa: Zarejestrowani
Postów: 162
Pomógł: 26
Dołączył: 19.01.2007

Ostrzeżenie: (0%)
-----


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

Ten post edytował kitol 2.02.2008, 13:32:23
Go to the top of the page
+Quote Post
mxm
post
Post #11





Grupa: Zarejestrowani
Postów: 46
Pomógł: 1
Dołączył: 9.06.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
kitol
post
Post #12





Grupa: Zarejestrowani
Postów: 162
Pomógł: 26
Dołączył: 19.01.2007

Ostrzeżenie: (0%)
-----


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)

Ten post edytował kitol 3.02.2008, 16:23:43
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 16:00