![]() |
![]() ![]() |
![]() |
![]()
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.
-------------------- |
|
|
![]()
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. |
|
|
![]()
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? -------------------- |
|
|
![]()
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.
|
|
|
![]()
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:
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). 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 ![]() 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). |
|
|
![]()
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. |
|
|
![]()
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 ![]() Oba rozwiązania są dobre, i moim zdaniem wybór zależy już od naszych przyzwyczajeń czy upodobań. |
|
|
![]()
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
|
|
|
![]()
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?
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
@gothye:
![]() |
|
|
![]()
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
![]() 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. -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 25.07.2025 - 09:12 |