Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Sposób zapisywania danych w DB
Barcelona
post
Post #1





Grupa: Zarejestrowani
Postów: 322
Pomógł: 15
Dołączył: 29.01.2010

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


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 :/

Ten post edytował Barcelona 5.03.2012, 16:22:00
Go to the top of the page
+Quote Post
skowron-line
post
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


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ł.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
basstone
post
Post #3





Grupa: Zarejestrowani
Postów: 40
Pomógł: 6
Dołączył: 20.12.2011

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


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





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


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





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


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.

Ten post edytował wNogachSpisz 5.03.2012, 19:05:47
Go to the top of the page
+Quote Post
Barcelona
post
Post #6





Grupa: Zarejestrowani
Postów: 322
Pomógł: 15
Dołączył: 29.01.2010

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


Dzięki, rozważę wszystkie sugestie smile.gif
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: 20.08.2025 - 09:09