Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Jedna zbiorcza tabela czy kilka?, dla komentarzy
deha21
post 11.12.2011, 19:12:28
Post #1





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


Lepszym wyjściem jest stworzenie jednej zbiorczej tabeli dla systemu komentarzy czy rozbicie jej na kilka? Komentarze pochodziłyby z newsów, artykułów, galerii zdjęć itd. Czy może stworzyć osobną tabelę dla każdego działu, np. 'komentarze_newsy', 'komentarze_artykuly' itd.


--------------------
Go to the top of the page
+Quote Post
Crozin
post 11.12.2011, 19:21:07
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Raczej kilka.
1. Każdy rodzaj komentarza ma odwołanie (klucz obcy) do innej, specyficznej dla swojego typu tabeli.
2. Nawet jeżeli początkowo wszystkie komentarze są dokładnie taką samą strukturą (z pominięciem klucza obcego z pkt. #1) nie oznacza to, że w przyszłości będą.
3. Nawet w ramach jednakowej struktury mogą istnieć inne "parametry" co do samych danych dla różnych komentarzy.
Go to the top of the page
+Quote Post
deha21
post 11.12.2011, 21:17:15
Post #3





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


Ok, czyli tak jak zrobiłem za pierwszym razem.
Jeszcze mam drugie małe pytanie (nie chce zakładać nowego tematu). Potrzebuję przetrzymać w bazie wstęp do artykułu (max 200 znaków) - co lepsze VARCHAR czy TINYTEXT?


--------------------
Go to the top of the page
+Quote Post
Crozin
post 11.12.2011, 22:47:45
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Niby VARCHAR ma wystarczającą pojemność (do 255 znaków), ale pewnie w takim opisie może znaleźć się do 200 widocznych znaków, a nie znaków w ogóle - ma tu na myśli przykładowo elementy HTML-a takie jak odnośniki, paragrafy czy jakieś cytaty. Co więcej raczej wątpię byś miał potrzebę zakładania indeksu na taką kolumnę, tak więc raczej sugerowałbym kolumnę typu TEXT - wygenerują one takie samo obciążenie, a wydają się trafniejszym wyborem dla tego typu kolumny.
Go to the top of the page
+Quote Post
phpion
post 12.12.2011, 08:32:40
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Ja byłbym za 1 tabelą zbiorczą. Nie założysz na takiej tabeli więzów integralności, ale za to "podpięcie" komentarzy do kolejnego elementu (produkty w sklepie, filmiki, konta użytkowników - cokolwiek) zrobisz pstryknięciem palca. Co do uwag Crozina:

Cytat(Crozin @ 11.12.2011, 19:21:07 ) *
1. Każdy rodzaj komentarza ma odwołanie (klucz obcy) do innej, specyficznej dla swojego typu tabeli.

Fakt, ale można zapisać object_id (ID rekordu, którego tyczy komentarz) oraz object_type (np. 1 newsy, 2 zdjęcia itd).

Cytat(Crozin @ 11.12.2011, 19:21:07 ) *
2. Nawet jeżeli początkowo wszystkie komentarze są dokładnie taką samą strukturą (z pominięciem klucza obcego z pkt. #1) nie oznacza to, że w przyszłości będą.

Teoretyzowanie smile.gif

Cytat(Crozin @ 11.12.2011, 19:21:07 ) *
3. Nawet w ramach jednakowej struktury mogą istnieć inne "parametry" co do samych danych dla różnych komentarzy.

Nie ma co w tym przypadku aż tak wybiegać w przyszłość. Komentarze to komentarze - treść. W przypadku konieczności dodania dodatkowych parametrów można wówczas utworzyć tabelę uzupełniającą parametry dla konkretnego typu komentarzy. Jednak jakie jest prawdopodobieństwo, że komentarze będzie trzeba rozbudować o jakieś parametry? Wg mnie małe.

Moim zdaniem 1 tabela ma sporo plusów:
- komentarze masz w 1 miejscu (rozbudowa ich o dodatkową kolumnę to modyfikacja 1 tabeli),
- dodanie komentarzy do kolejnego elementu systemu jest dziecinnie proste,
- prędkość wyszukiwania komentarzy dla konkretnego elementu (object_id + object_type) jest bardzo zbliżona do zwykłego (object_id).

Ostatnio zastosowałem podobne podejście w jednym z portali. Dotyczyło jednak tagów. Nie robiłem tabel photo_tags, article_tags itd. tylko 1 object_tags. Dodanie tagowania np. profilu użytkownika to dosłownie chwila pracy. Podejście to sprawdza się znakomicie. Trzeba tylko pamiętać, że przy usuwaniu danego rekordu należy ręcznie usunąć powiązane z nim tagi (brak klucza obcego ON DELETE CASCADE).
Go to the top of the page
+Quote Post
Crozin
post 12.12.2011, 09:20:42
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@phpion: Prawdę powiedziawszy oba rozwiązania mają drobne plusy i minusy względem siebie.

Dodanie komentarzy do nowego elementu? W obu przypadkach to dosłownie chwila roboty. W jednym robisz niemal bezmyślne copy-n-paste w drugim dodajesz nowy wariant dla kolumny z typem. Obie procedury powtarzasz po stronie bazy danych i aplikacji.
Dodanie nowego elementu do każdego rodzaju aplikacji? Tutaj rzeczywiście na pierwszy rzut oka jedna tabela to mniej roboty, ale... ale zapewne będzie korzystać z jakiegoś ORM-a, a te oferują dziedziczenie, więc wspólne cechy wszystkich komentarzy wydzieli sobie do jednego elementu, a resztę załatwi automat. Swoją drogą nawet niektóre bazy danych oferują dziedziczenie, ale tego raczej bym tutaj nie polecał. A jak już przy ORM-ach i innych "zewnętrznych" narzędziach jesteśmy to warto zaznaczyć, że co prawda poradzą sobie one w obu przypadkach, ale pierwszy sposób jest jednak znacznie łatwiejszy w użyciu.
Więzły integralności? W obu przypadkach da się je całkiem łatwo załatwić. W pierwszym nawet nie trzeba o tym wspominać, w drugim wystarczy dodać wyzwalacze dla każdej z komentowanej tabeli by po usunięciu elementu usunąć również powiązane z nim komentarze.
Prędkość wyszukiwania jak już sam zauważyłeś będzie bardzo zbliżona w obu przypadkach.

Podsumowując, wg mnie największą zaletą - i raczej każdy się tutaj zgodzi - pierwszego rozwiązania jest bardziej naturalna realizacja relacji obiekt-komentarze, która wykorzystuje podstawowe mechanizmy relacyjnych baz danych, których to zaś wykorzystanie umożliwia lepszą współpracę z różnego rodzaju trzecim-oprogramowaniem. A ewentualne wady tego podejścia - i tutaj już się nie każdy musi zgadzać - są raczej nieistotne i łatwo eliminuje się je w normalnym projekcie.
Go to the top of the page
+Quote Post
by_ikar
post 12.12.2011, 10:47:38
Post #7





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

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


Odniosę się jedynie do tego fragmentu:

Cytat
dodanie komentarzy do kolejnego elementu systemu jest dziecinnie proste


Wydaje mi się że to nie ma znaczenia czy do jednej tabeli, czy do kilku są zapisywane komentarze. Musisz tak czy siak podać jaki argument, który będzie "kategorią" zapisu tych komentarzy, czyli sama obsługa tych komentarzy jest transparentna, czyli tym samym obsługa w każdym przypadku (jednej lub wielu tabel) jest taka sama. Dodanie komentarzy w każdym przypadku powinno być takie samo. Tak samo jest chociażby z sesjami, cache, bazami danych etc.

Moim zdaniem, minus przechowywania komentarzy w wielu tabelach, to sytuacja kiedy użyszkodnikowi udostępniamy przeszukiwanie tych komentarzy. W przypadku kilku osobnych tabel, może to nie stanowić aż tak wielkiego problemu, ale w przypadku dość rozbudowanego systemu komentarzy (komentarze gdzie popadnie; newsy, arty, profile usera, galerię, pojedyncze zdjęcia, wpisy blogowe, i tym podobne) takie przeszukiwanie może być dość problematyczne. Z racji że chyba jeszcze nawet takiej opcji na żadnej mi znanej stronie nie widziałem, to wydaje mi się że taki mankament, to w sumie żaden mankament, tylko czyste teoretyzowanie wink.gif

Oba rozwiązania są dobre, i moim zdaniem wybór zależy już od naszych przyzwyczajeń czy upodobań.
Go to the top of the page
+Quote Post
gothye
post 12.12.2011, 11:08:32
Post #8





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

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


Ja bym zastosował inne rozwiązanie :

np 4 bazy comments_0 , comments_1 , comments_2 , comments_3

w każdej z nich tabele :

news
artykuły

pobieranie oraz dodawanie do baz wykonywane byłoby po modulo id (artykułu , news)
np dla news :

czyli comments_( 4 % id_news)


--------------------
Nie udzielam pomocy poprzez PW
Go to the top of the page
+Quote Post
Crozin
post 12.12.2011, 11:44:22
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@gothye: Co to niby miałoby być? Sposób na zarżnięcie jakiejkolwiek pracy związanej z aplikacją czy zwykła nieznajomość mechanizmów partycjonowania baz danych?
Go to the top of the page
+Quote Post
phpion
post 12.12.2011, 12:03:26
Post #10





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@gothye:
smile.gif Jedno pytanko: po co tak kombinować i utrudniać sobie życie?
Go to the top of the page
+Quote Post
deha21
post 13.12.2011, 15:37:11
Post #11





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


Tworzyć 4 bazy pod każdy typ komentarzy? Eee chyba niezbyt optymalne wyjście wink.gif
Ja generalnie jestem za tym, że by zrobić jedną tabelę dla wszystkich komentarzy. Ich budowa na pewno się nie zmieni, a nawet gdyby to dam sobie radę. Zaletą jest dla mnie na pewno przejrzystość informacji i wygodniejsze wyszukiwanie ich, oraz to, że łatwiej będzie w przyszłości dodać je do kolejnego modułu.


--------------------
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 Wersja Lo-Fi Aktualny czas: 25.07.2025 - 09:12