Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jedna duża tabela, czy kilka mniejszych?, Optymalizacja bazy danych
awakening
post
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 12.01.2008
Skąd: Warszawa

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


Witam,

jestem na etapie projektowania struktury bazy danych dla dosyć dużego serwisu (baza obiektów turystycznych) i zastanawiam się czy dane jednego obiektu lepiej przechowywać w jednej dużej tabeli czy w kilku mniejszych (dokładnie jak rozplanowałem to wyszło mi 8 małych), do wyświetlenia kompletnego wpisu potrzebny będzie dostęp do 7 z 8 tabel + 3 z danymi stałymi (z których będą pobierane np. nazwy województwa itp. - w opisie obiektu będzie tylko id rekordu z nazwą województwa), ale np do wyświetlenia wyników wyszukiwania już tylko 4-5 + 2-3 z danymi stałymi. Najkorzystniej zapewne byłoby to zrobić właśnie w ten sposób tylko jestem ciekaw na ile pobieranie danych z różnych tabel w jednym zapytaniu jest mniej efektywne od pobierania danych z jednej dużej tabeli? Gdybym zrobił wszystko w jednej tabeli miałaby ona ok 40 kolumn, więc wydaje mi się, że jest to bezsensu.

Co do ilości zapytań to zdecydowanie większy nacisk kładę na ograniczenie ich liczby przy pobieraniu danych z bazy niż przy dodawaniu (do dodania jest taka liczba danych, że to i tak pożre od 10 do 100 zapytań dla jednego obiektu, ale obiekty będą dodawane stosunkowo powoli).

Dzięki serdeczne za pomoc smile.gif
Maciek
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
muniekw
post
Post #2





Grupa: Zarejestrowani
Postów: 243
Pomógł: 22
Dołączył: 1.06.2009
Skąd: Warszawa

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


Jak dla mnie lepiej jest używać kilku mniejszych tabel. Przy większej ilości użytkowników przetwarzanie jednej większej tabeli może być sporym obciążeniem dla bazy.
Go to the top of the page
+Quote Post
wookieb
post
Post #3





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




A przy ich wyszukiwaniu trudniej przeszukac wszystkie tabele. Wiec lepsza jedna duza.


--------------------
Go to the top of the page
+Quote Post
phpion
post
Post #4





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




Może więc zastosować kilka mniejszych tabel (np. ze względu na normalizację bazy danych) oraz utworzyć widok łączący te tabele (ze względu na wygodę użytkowania)?
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


@muniekw:
Cytat
Jak dla mnie lepiej jest używać kilku mniejszych tabel. Przy większej ilości użytkowników przetwarzanie jednej większej tabeli może być sporym obciążeniem dla bazy.


O_O - a to od kiedy? ze niby szybiej sie wykona siedmiotabelowy join niz przegladanie jednej tabeli?


@phppion
No ale widok to nic innego jak skrot do SELECTa, ulatwia pisanie zapytanek a nic nie przyspiesza.
DO szukarki mozesz sobie przygotowac index w jednej tabeli - tak zebys tylko ja przeszukiwal, a do wyswietlania listy obiektow - albo skorzystaj z indeksu albo juz z joinow.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
awakening
post
Post #6





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 12.01.2008
Skąd: Warszawa

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


Jakiś podział na tabele na pewno będę musiał zastosować gdyż np. do jednego obiektu może być przypisanych kilka zdjęć, lub atrybutów (nawet kilkadziesiąt), więc nie ma opcji żebym tworzył oddzielną kolumnę w tabeli głównej dla każdego z nich.

Mówicie żeby utworzyć jeszcze jedną tabelę opisującą dokładnie relacje, ale problem będzie gdy np jeden rekord w tabeli głównej w polu powiedzmy 'obrazek' będzie musiał przekazać id kilkunastu obrazków z tabeli 'obrazki' (sytuacja gdy do jednego obiektu przypisanych jest kilka zdjęć, a info o tych zdjęciach umieszczone jest w oddzielnej tabeli z id obiektu)
Go to the top of the page
+Quote Post
muniekw
post
Post #7





Grupa: Zarejestrowani
Postów: 243
Pomógł: 22
Dołączył: 1.06.2009
Skąd: Warszawa

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


Chodzi mi o to, że nie sztuką jest wszystko wpakować do jednej tabeli i tylko na niej operować. Istnieje przecież coś takiego jak postacie normalne.

@dr_bonzo
Cytat
O_O - a to od kiedy? ze niby szybiej sie wykona siedmiotabelowy join niz przegladanie jednej tabeli?
Z tym się zgodzę, że złączenia 7 tabel będą się wolniej wykonywały niż operacje na jednej tabeli.

Ten post edytował muniekw 15.06.2009, 09:15:22
Go to the top of the page
+Quote Post
awakening
post
Post #8





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 12.01.2008
Skąd: Warszawa

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


Czyli chyba najbardziej optymalnym rozwiązaniem będzie stworzenie dodatkowych tabel tylko dla danych, które wymagają kilku rekordów (zdjęcia, atrybuty itp.), dobrze myślę?

Ten post edytował awakening 15.06.2009, 09:37:20
Go to the top of the page
+Quote Post
muniekw
post
Post #9





Grupa: Zarejestrowani
Postów: 243
Pomógł: 22
Dołączył: 1.06.2009
Skąd: Warszawa

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


Według mnie poczytaj sobie o postaciach normalnych i myślę, że znajdziesz to czego szukasz, bo możemy dyskutować o tym, która metoda jest lepsza, ale tak na prawdę Ty sam wiesz najlepiej jakich Ci potrzeba tabelek i do czego mają być one używane, a jak poczytasz sobie o postaciach normalnych to tam jest napisane czym charakteryzuje się dobrze stworzona baza i jak powinna być prawidłowo zaprojektowana.
Go to the top of the page
+Quote Post
awakening
post
Post #10





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 12.01.2008
Skąd: Warszawa

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


Poczytałem i z tego co wyczytałem, to będę musiał zrobić podział na jeszcze większą ilość tabel sciana.gif
Go to the top of the page
+Quote Post
muniekw
post
Post #11





Grupa: Zarejestrowani
Postów: 243
Pomógł: 22
Dołączył: 1.06.2009
Skąd: Warszawa

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


Wiem, że zaprojektowanie dobrej bazy danych dla większych serwisów wiąże się niestety z dużymi problemami, aby wszystko było dobrze zrobione, ale nie martw się. Będziesz mieć bardzo optymalną bazę smile.gif

Ten post edytował muniekw 15.06.2009, 10:42:13
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #12





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Cytat(muniekw @ 15.06.2009, 10:14:51 ) *
Chodzi mi o to, że nie sztuką jest wszystko wpakować do jednej tabeli i tylko na niej operować. Istnieje przecież coś takiego jak postacie normalne.

@dr_bonzo
Z tym się zgodzę, że złączenia 7 tabel będą się wolniej wykonywały niż operacje na jednej tabeli.


+

Cytat
Według mnie poczytaj sobie o postaciach normalnych i myślę, że znajdziesz to czego szukasz, bo możemy dyskutować o tym, która metoda jest lepsza, ale tak na prawdę Ty sam wiesz najlepiej jakich Ci potrzeba tabelek i do czego mają być one używane, a jak poczytasz sobie o postaciach normalnych to tam jest napisane czym charakteryzuje się dobrze stworzona baza i jak powinna być prawidłowo zaprojektowana.


To bedzie mial joina na 20 tabel.

@awakening: pomysl o dodatkowej tabeli z indeksem (jak juz mowilem) - wrzucisz tam wszystko wg czego szukasz, i pokazujesz na wynikach wyszukiwania (nie wiecej). Albo tylko do szukania, przed pokazaniem pobierzesz ID rekordow i pobierzesz je normalnie WHERE ID IN ( 1,2,3,... ).

No ale nie znam szczegolow twojej bazy wiec musisz sam to ocenic czy to bedzie mialo sens.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
muniekw
post
Post #13





Grupa: Zarejestrowani
Postów: 243
Pomógł: 22
Dołączył: 1.06.2009
Skąd: Warszawa

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


@dr_bonzo
Cytat
To bedzie mial joina na 20 tabel.

A czy w obsłudze rekordów w bazie potrzebne będą akurat złączenia tabel? Bo może nie będzie potrzeby robić złączeń i po co kombinować?
Go to the top of the page
+Quote Post
awakening
post
Post #14





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 12.01.2008
Skąd: Warszawa

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


Do wyświetlenia pełnego opisu (czyli tak naprawdę wszystkie dane, poza takimi czysto technicznymi jak ip itp.) będą potrzebne niestety wszystkie tabele.

Zastanawia mnie tylko dlaczego wszędzie zalezane jest normalizowanie baz danych skoro join'owanie tabel jest mało wydajne ? blink.gif
Ciekaw jestem jak ten problem jest rozwiązany w bardzo duzych serwisach, które obsługują miliony użytkownik, chociażby nasza-klasa...
Go to the top of the page
+Quote Post
erix
post
Post #15





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Zastanawia mnie tylko dlaczego wszędzie zalezane jest normalizowanie baz danych skoro join'owanie tabel jest mało wydajne ?

Gdyż nie ma problemu ze skalowalnością, etc.

Cytat
Ciekaw jestem jak ten problem jest rozwiązany w bardzo duzych serwisach, które obsługują miliony użytkownik, chociażby nasza-klasa...

Replikacja oraz load-balancing. O cache nie wspomnę.

Ciekawostka: Google nie byłoby takie szybkie, gdyby nie cache w RAM-ie części (większości?) tabel. [;
Mnesia w Erlangu też podobnie robi; część tabel na HDD, część w RAM albo mieszane.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
awakening
post
Post #16





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 12.01.2008
Skąd: Warszawa

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


Dobra, sam już nie wiem co mam zrobić, serwis początkowo, do czasu gdy nie zacznie przynosić dochodów (lub nie pojawią się takie oznaki) będzie hostowany w nazwa.pl (jak nie wytrzyma to pomyśle o jakimś VPS'ie), później po zakupieniu maszyny dedykowanej mogę pomyśleć o replikacji, cache itd. Na razie muszę to uruchomić w taki sposób żeby było jak najmniejsze obciążenie, kusi mnie normalizacja, bo lubię mieć wszystko poukładane, ale boję się, że efekt będzie gorszy niż upchanie wszystkiego w 3-4 tabelach... jakieś pomysły?

Ten post edytował awakening 15.06.2009, 11:43:55
Go to the top of the page
+Quote Post
muniekw
post
Post #17





Grupa: Zarejestrowani
Postów: 243
Pomógł: 22
Dołączył: 1.06.2009
Skąd: Warszawa

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


Możesz na początek spróbować zrobić to jak mówisz czyli te 3-4 tabelki. Jak nie bardzo Ci będzie to śmigać to wtedy możesz spróbować przerobić bazę. Tylko pomyśl czy nie prościej pomęczyć się od razu i mieć spokój niż później w przyszłości wszystko przerabiać smile.gif

Ten post edytował muniekw 15.06.2009, 11:57:08
Go to the top of the page
+Quote Post
awakening
post
Post #18





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 12.01.2008
Skąd: Warszawa

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


Ja chętnie zrobię od razy normalizacje, ale przeraża mnie ta liczba joinów, zwłaszcza na tym "serwerze"...

może ktoś jest w stanie się wypowiedzieć na temat serwerów, nigdy nie stawiałem nic większego na tym pseudo serwerze od nazwy (active, ten po 300zł), ciekawi mnie jak długo pociągnie nim będę musiał zainwestować w coś lepszego?
na ile pozwoli mi np. taki serwer: http://www.ovh.pl/produkty/rps4.xml ? nie jest to maszyna dedykowana, ale wydaję się być mocna
Go to the top of the page
+Quote Post
erix
post
Post #19





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




RPS-y mają współdzielone HDD po sieci, więc to może być wąskie gardło...


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
awakening
post
Post #20





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 12.01.2008
Skąd: Warszawa

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


Można wykupić wersję ze zwiększonym minimalny przepływ ISCSI, do 4, albo 10mb/s
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Aktualny czas: 19.08.2025 - 10:13