Ta strona używa ciasteczek (cookies), dzięki którym nasz serwis może działać lepiej. Dowiedz się więcej OK, rozumiem

Komentarze i odpowiedzi

Zdecydowałeś się na tworzenie interaktywnych stron przy pomocy PHP? Chcesz w łatwy i szybki sposób zarządzać danymi na swojej stronie? Tutaj znajdziesz pomoc w napotkanych przy tym trudnościach.

Komentarze i odpowiedzi

Post 20.11.2017, 20:25:26

Witam,

Mam pytanie - chcę na maksa zminimalizować ilość zapytań do bazy danych, więc nie robię dwóch tabelek na komentarze i odpowiedzi do nich, zrobiłem więc jedną, która wygląda tak:

| id|content|reply_to|post_id|
| 1 |aaaaaa | -1 | 1 |
| 2 |bbbbbb| 1 | 1 |
| 3 |cccccc | 1 | 1 |
| 4 |dddddd| -1 | 1 |
| 5 |eeeeee| 1 | 1 |
| 6 |fffffffff| 4 | 1 |

więc tak, chcę zrobić wyświetlanie w stylu:

komentarz_1:
- odpowiedź_1.1
- odpowiedź_1.2
komentarz_2:
- odpowiedź_2.1
- odpowiedź_2.2
- odpowiedź_2.3

w PHP sobie ogarniam już wyświetlanie tego, tylko pozostaje kwestia zapytania, chcę uzyskać komentarze posortowane - komentarz główny (reply_to == -1), pod nim odpowiedzi - czyli te, które reply_to != -1.
Do tego wiadomo, pobieranie tylko dla konkretnego posta.

z góry dziękuję!
FalcoPL
Szymon

Posty: 20
Dołączył(a): 14.04.2017

Re: Komentarze i odpowiedzi

Post 23.11.2017, 20:48:37

Nie no, ruch i pomoc na forum powalające... Może chociaż jakaś wskazówka?
FalcoPL
Szymon

Posty: 20
Dołączył(a): 14.04.2017

Re: Komentarze i odpowiedzi

Post 23.11.2017, 21:24:54

FalcoPL napisał(a):chcę na maksa zminimalizować ilość zapytań do bazy danych, więc nie robię dwóch tabelek na komentarze i odpowiedzi do nich

Zacznijmy od tego, że zminimalizowanie liczby zapytań do bazy nie ma nic wspólnego z liczbą tabel (ani na odwrót). Pamiętaj też, że zmniejszanie liczby zapytań nie może być celem samym w sobie, bo nie zawsze daje pozytywne efekty - czasem lepiej skorzystać z kilku dobrze napisanych zapytań niż z jednego "potworka". ;)

Poza tym nie wiem po co miałbyś robić dwie tabele dla komentarzy - rozwiązanie, które wybrałeś, jest dobre i powszechnie stosowane.

Generalnie nie zrobisz tego jednym zapytaniem - chyba że jakimś napisanym na siłę potworem. ;)

Najprostsza (ale nie najefektywniejsza) metoda to wyciągnąć sobie wszystkie komentarze dla wpisu (post_id = id_aktualnego_wpisu AND reply_to = -1 - nie podoba mi się to -1, tam powinno być zero), wyświetlać je w pętli i dla każdego z nich dobierać kolejnym zapytaniem odpowiedzi, czyli komentarze z warunkiem "reply_to = id_komentarza". Zapytań będzie tyle, co komentarzy (plus jedno zapytanie główne), ale zakładając, że masz zrobione odpowiednie indeksy, to będą one szybkie.

Inną metodą jest wybranie wszystkich komentarzy (jak wyżej), a następnie w jednym zapytaniu wszystkich odpowiedzi dla wszystkich komentarzy. Najprościej jest po prostu zebrać identyfikatory wszystkich komentarzy z pierwszego zapytania (w pętli, przed ich wyświetleniem) i zrobić drugie zapytanie z warunkiem "WHERE reply_to IN (id1, id2, id3) ORDER BY reply_to, id". Potem wyświetlasz komentarze w pętli i dla każdego szukasz w wyniku tego zapytania odpowiedzi na niego. Ta metoda jest trochę bardziej skomplikowana, ale przy dużej liczbie komentarzy z odpowiedziami będzie bardziej efektywna. No i wykonuje tylko dwa zapytania, z tym że to drugie może być nieco bardziej kosztowne.

To oczywiście nie są wszystkie sposoby na komentarze z odpowiedziami, ale mam nadzieję, że chociaż trochę pomogłem. ;)
Avatar użytkownikatoszcze
Bartosz Romanowski

SuperGod
SuperGod

Posty: 8899
Dołączył(a): 14.10.2003
Lokalizacja: Mysłowice

Re: Komentarze i odpowiedzi

Post 24.11.2017, 08:46:59

Okay, czyli sugerujesz, że metoda polegająca na wyciągnięciu wszystkich komentarzy dla danego postu, gdzie reply = -1 (dobra, zmienię ;)) i postId = {konkretny post}, a następnie już na stronie robić pętlę, która dla każdego głównego wyciągnie pozostałe?

Myślałem o tej opcji, ale stwierdziłem, że może za bardzo zamulić ;)
FalcoPL
Szymon

Posty: 20
Dołączył(a): 14.04.2017

Re: Komentarze i odpowiedzi

Post 24.11.2017, 09:16:19

Ta metoda jest najprostsza w implementacji. Nie powinieneś mieć problemów z wydajnością, chyba że komentarzy będzie naprawdę dużo (setki tysięcy) i ruch na stronie będzie spory (to można załatwić jakimś cache). Zawsze (bez zmiany struktury bazy) będziesz mógł zmienić algorytm wyświetlania komentarzy na inny.
Avatar użytkownikatoszcze
Bartosz Romanowski

SuperGod
SuperGod

Posty: 8899
Dołączył(a): 14.10.2003
Lokalizacja: Mysłowice

Re: Komentarze i odpowiedzi

Post 24.11.2017, 11:37:29

Jest masa sposobów implementacji tego. Ten zaproponowany przez toszcze jest najbardziej łopatologiczny, najprostszy do ogarnięcia rozumem. Nie powinien też sprawiać zbyt wielu problemów wydajnościowych, jeśli masz dobrze indeksy ustawione. Tak w zasadzie działa WordPress, jak dobrze kojarzę.

Jedno tylko pytanie, czy odpowiedzi mogą być jeszcze głębiej zagnieżdżone, tj. odpowiedź na odpowiedź komentarza?

Jeśli odpowiedź na pytanie jest twierdząca i chcesz móc wyciągać dane jednym zapytaniem, które w dodatku nie będzie "zbyt ciężkie", możesz konstruować strukturę komentarzy (dodatkowa kolumna, nazwijmy ją comment_tree) w ten sposób

"000" - komentarz 1
"001" - komentarz 2
"000.000" - odpowiedź na komentarz 1
"000.001" - druga odpowiedź na komentarz 1
"000.000.000" - odpowiedź na odpowiedź do komentarza 1

Wtedy zapytanie będzie w stylu

Kod: Zaznacz cały
SELECT * FROM comments WHERE post_id = 1 ORDER BY comment_tree ASC


powyciąga je w taki sposób, że odpowiedzi na komentarze będą zaraz pod komentowanym komentarzem, a to wszystko przez to, że ta struktura sortuje się w taki sposób leksykograficznie.

Wadami tego rozwiązania są:
- dużo bardziej skomplikowany INSERT (lub nawet konieczna kombinacja SELECTów + INSERT)
- gdy na poszczególne poziomy komentarzy użyjesz 3 cyfr, to masz możliwość wstawienia 1000 komentarzy na poziom, ale jak dodasz kolejną cyfrę "0000", to masz już 10000 możliwych komentarzy na każdy poziom
- ilość zagnieżdżeń jest ograniczona przez długość pola bazy danych (np. VARCHAR(100)). Ale MySQL < 5.0.3 narzucał maksymalną długość na 255, a nowsze na 65535. Przyjmując długość 255, dostajesz możliwość komentowania na ~63 poziomach, więc 62 odpowiedzi na odpowiedź na odpowiedź ... na odpowiedź wydaje się być wystarczająca, prawda?
- im dłuższy typ tym gorsza wydajność, ale znowu nie ma tragedii
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19665
Dołączył(a): 14.04.2002


Powrót do PHP i bazy danych


 


  • Podobne wątki
    Odpowiedzi
    Wyświetlone
    Ostatni post

Kto przegląda forum

Użytkownicy przeglądający ten dział: Darjetii, Google Adsense [Bot] i 10 gości

Hosting, Domeny, SSL

Subskrypcja

Mamy 50899 zarejestrowanych użytkowników.
Najnowszy użytkownik: yjaheliq


Nasi użytkownicy napisali:

  • 936398 wiadomości
  • w 246843 tematach

Najnowsze wpisy na blogu

Najnowsze artykuły

Najaktywniejsi (ostatnie 30 dni)