![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 544 Pomógł: 5 Dołączył: 18.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Cześć, przebudowuję swojego CMSa i zastanawiam się jakie rozwiązanie będzie lepsze.
Mam tabele/sekcje news, videos, polls i w każdej z nich użytkownicy mogą dodawać komentarze. Do tej pory miałem news_comments, videos_comments, polls_comments. Nie wiem czy nie lepiej zrobić zbiorcze commnets i po prostu zrobić pole section gdzie wpisywałbym news, videos albo polls. Aktualnie mam łącznie ok. 100 000 komentarzy więc co lepsze myśląc perspektywicznie? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Ja mam zbiorcze z polem na typ/sekcje jak to wspomniales. Dzieki temu mam zawsze jeden kod na komentarze i przy zmianie zmieniam tylko ten jeden.
Przy roznych tabelach gdy chcesz dodac nowe komentarze do czegos innego to znowu musisz tworzyc nowa tabele i sie babrac. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Również polecam 1 tabelę zbiorczą. Jest to dość wygodne rozwiązanie
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 380 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
W mysql sensowne. W innych niekoniecznie. Np Postgres 10 ma pięknie partycjonowanie danych, do tego tabele dziedziczące. Dopóki nie masz tam rekordów idących w miliony to powinien sobie dać radę silnik mysql.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 544 Pomógł: 5 Dołączył: 18.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za odpowiedzi. Będę robił zbiorczą - działam w MySQL.
Z kategoriami zrobić podobnie? Teraz mam news_category, videos_category. Ten post edytował deha21 29.09.2017, 12:40:30 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
tak
|
|
|
![]()
Post
#7
|
|
Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Pozwolę sobie podbić temat. W jaki sposób w przypadku takich zbiorczych tabel dbacie o integralność danych? Chodzi mi o rozwiązanie po stronie bazy danych. Pierwsza i chyba najsensowniejsza myśl jaka mi przychodzi do głowy to trigger ale może macie inne patenty. W przypadku Postgresa można przypiąć kilka trigerrow na to samo zdarzenie do jednej tabeli ale co w przypadku MySQL? Modyfikujecie ewentualny istniejący już trigger?
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
O jakiej integralności mówisz?
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Pewnie chodzi o klucze obce, których tu nie zastosujesz.
|
|
|
![]()
Post
#10
|
|
Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Tak, chodzi mi o klucze obce, a konkretnie niedopuszczenie do sytuacji gdy istnieją komentarze do newsa, którego nie ma.
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 6 380 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
A jak ta tabela wygląda konkretnie? Bo newsy z komentarzami to zazwyczaj
newsy: id, cośtam komentarze: id, id_newsa Naprawdę trzeba się bardzo postarać żeby to zostawić luzem (bo nie widzę zastosowania żadnego do ustawiania null na on delete). |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
W mysql też da się ustawić kilka triggerów na 1 tabelę na to samo zdażenie np. BEFORE INSERT.
I tutaj to jest chyba jedyne sensowne rozwiązanie tylko że tutaj musisz ustawiać trigger nie na comments a na tabelę która będzie źródłem np. news. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Polecam używanie ORMa a tego typu problemy całkowicie znikają. Można nawet ustawić, by komentarze do artykułów to były inne obiekty niż do blogów a i tak wszystko zamapować na jedną tabelę - jak kto lubi. Rozstawianie po kątach sierot? orphanRemoval=true i problem znika.
|
|
|
![]()
Post
#14
|
|
Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
@viking:
Mówimy tutaj o 1 tabeli z komentarzami do X obiektów (tabel) wiec klucza obcego nie postawisz. @Pyton: Fakt, od 5.7.2 można ustawić kilka triggerow - wow, w końcu ktoś odkrył taka możliwość! I to wg mnie rozwiązuje problem w sposób wygodny i elegancki. @Pilsener: Mi chodziło o zadbanie o to po stronie bazy danych, a nie aplikacji. Zdarza sie przecież ze jest potrzeba ingerencji w dane z poziomu bazy z pominięciem aplikacji wiec to sama baza powinna pilnować spójności danych. |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 6 380 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
Czyli np mialbys tabele artykułów i wiadomości a komentarze linkuja do pk obu tabel? I gdzieś jeszcze kolumna z typem tabeli (czy artykuły, czy wiadomości)?
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Tutaj ciekawostka jak to jest rozwiązanie na poziomie ORM/Eloquent w Laravel:
https://laravel.com/docs/5.5/eloquent-relat...rphic-relations Ale nie powiem - również lubię mimo wszystkie mieć porządnie zrobione klucze bo to jest zawsze druga linia zabezpieczeń aby nie mieć bałaganu w bazie. ORM o to zadba tylko wtedy gdy się nie pomylimy, zapytania wykonają się zawsze wszystkie i do końca itd. Poza tym klucze to też pewnie jakiś zastrzyk optymalizacji no i już taka trywialna korzyść, phpmyadmin linkuje fajnie ID do wiersza (IMG:style_emoticons/default/smile.gif) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 14:19 |