![]() |
![]() ![]() |
![]() |
![]() ![]()
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 ![]() Edit:// rozwaliło moje tabelki :/ Ten post edytował Barcelona 5.03.2012, 16:22:00 |
|
|
![]()
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/ |
|
|
![]()
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 ![]() |
|
|
![]()
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
![]() |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 233 Pomógł: 87 Dołączył: 6.03.2009 Ostrzeżenie: (40%) ![]() ![]() |
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 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 322 Pomógł: 15 Dołączył: 29.01.2010 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki, rozważę wszystkie sugestie
![]() |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 09:09 |