Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Sposób zapisywania danych w DB
Forum PHP.pl > Forum > Przedszkole
Barcelona
Witam, mam takie pytanko odnośnie zapisu danych w DB. Problem przedstawię na zasadzie oglądania filmów.

Jeden film oglądały 4 osoby i nie wiem czy taki stan rzeczy zapisywać w takiej formie:

|---------|---------------|
|id_filmu|id_ogladaczy|
|---------|---------------|
| 12 | 1,3,4,56,23 |
|---------|---------------|

Czyli film od id 12 oglądali userzy kolejno o id 1, 2, 3, 4, 56, 23

Czy jednak tak:

|---------|---------------|
|id_filmu|id_ogladacza|
|---------|---------------|
| 12 | 1 |
|---------|---------------|
| 12 | 3 |
|---------|---------------|
| 12 | 4 |
|---------|---------------|
| 12 | 56 |
|---------|---------------|
| 12 | 23 |
|---------|---------------|

Czyli dla każdego usera jest osobny wpis w tabeli.
Wiem że obydwie formy są odpowiednie, ale nie wiem który jest najbardziej poprawny.
Pozdraaaaawiam smile.gif

Edit:// rozwaliło moje tabelki :/
skowron-line
Problem jest na poziomie selecta, zrób sobie 2 wersje z przykładowymi banymi i sprawdz jak będa wyglądały zapytania w których będziesz wyciągał film dla danego usera.
Ogólnie bije do 1 sposobu bo jest pomyłką której będziesz żałował.
basstone
Chyba lepiej będzie to zrobić tym drugim sposobem, który pokazywałeś. Przy pierwszym będziesz musiał później używać explode żeby sprawdzić kto dany film oglądał, trochę uryną by to zajeżdżało.

Przy drugim sposobie zrobisz tylko zapytanie "SELECT COUNT(`id_filmu`) FROM `tabela` WHERE `id_filmu` = 'x'" i wsio smile.gif
by_ikar
W pierwszym sposobie, weź sobie niech 20 tysiecy osób obejrzy ten film. Do tego będziesz musiał jakichś regexpy stosować, albo po stronie php, rozbijać to explode i kolejne zapytania stosować. Pierwszy pomysł nie jest ani trochę poprawny i jest strzałem w kolano wink.gif
wNogachSpisz
Tak jak napisał skowron.
Jeśli chcesz tylko archiwizować dane, to sposób #1 jest prawie ok.
Pytanie tylko czy pomyślałeś o sposobie na aktualizację wpisu... Nie znam się na bazach danych i nie pamiętam żeby istniała funkcja typu "append var".
Po wtóre, jeśli popularność filmu przekroczy wartość krytyczną, utracisz możliwość wydobywania danych z bazy, długość stingu przekroczy kilka MB i pojawią się problemy z limitami danych możliwych do jednorazowego przesyłania miedzy skryptem a bazą.. Także jesteś na dobrej drodze żeby złożyć bombę zegarową.
Jeśli bardzo chcesz się w to ładować, to pójdź o krok dalej i zenkapsuluj listę identyfikatorów przy pomocy json_encode, następnie go skompresuj co oczywiście ciągnie za sobą konieczność zmiany typu danych kolumny na binarny.. W tej chwili masz zbiór identyfikatorów oddzielonych przecinkami (tutaj potrzebne źródło, bo taki zbiór ma swoją fachową nazwę, języki formalne to dziedzina gdzie należałoby szukać terminu).

Stosując sposób 1 masz tylko archiwizacje, nie możesz tego w żaden sposób przeszukać. Nie możesz np. sprawdzić jakie filmy oglądał dany user w tym miesiącu, albo ile ich obejrzał.

Może dobrym rozwiązaniem dla Ciebie byłoby stworzenie kolumny "counter", gdzie każde otwarcie filmu powodowałoby uruchomienie zapytania w stylu "UPDATE movie SET counter + 1 WHERE id = 1".. Jak widzisz można stworzyć zapytanie w taki sposób, aby baza podniosła counter o 1 bez przesyłania informacji o bieżącym stanie counter’a do skryptu, to niweluje zagrożenie wystąpienia wyścigu zasobów.
Barcelona
Dzięki, rozważę wszystkie sugestie smile.gif
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.