Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [relacje] Sens ich używania
wszerad
post
Post #1





Grupa: Zarejestrowani
Postów: 106
Pomógł: 18
Dołączył: 11.12.2008

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


Zastanawiam się nad sensem korzystania z relacji, jedyną zaletę jaką mogę znaleźć to zmniejszenie rozmiaru bazy co może przełożyć się na większą wydajność.
Ale widzę tu znacznie więcej wad:
-pobranie danych w relacji na pewno jest mnie wydajne "SELECT imiona.imie FROM osoby,imiona WHERE osoby.id = 1 AND osoby.imie_id=imiona.id" VS "SELECT imie FROM osoby WHERE id = 1" musi być szybsze...
-widać też, że zapytanie jest dużo bardziej skomplikowane

Są przypadki gdzie zapisanie danych w relacji wymaga dużo większego obciążenie dysku:
Gdy do bazy chcemy dodać osobę najpierw musimy sprawdzić czy jej imię i nazwisko jest w bazie i pobrać ich id, dopiero w tym momencie możemy dodać osobę. Gorzej jeżeli imienia lub nazwiska nie ma w bazie bo dochodzą kolejne zapytania "INSERT".

Wychodzi więc iż trzeba przemyśleć gdzie relacje będą korzystne, w przypadku powyższym dużo lepiej wykorzystać jedną tabele, chyba, że potrzebujemy listę imion i nazwisk wtedy przy dodawaniu osoby wykonujemy jednocześnie 3 INSERTy gdzie w bazie imion i nazwisk ustawiamy wartości na unikalne.

Trzecia sprawa, czy w bazach, które raczą się zwać relacyjnymi nie ma jakiś narzędzi do upraszczania poleceń pobrania czy dodania rekordu?

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
erix
post
Post #2





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




Cytat
Trzecia sprawa, czy w bazach, które raczą się zwać relacyjnymi nie ma jakiś narzędzi do upraszczania poleceń pobrania czy dodania rekordu?

Masz na myśli procedury i widoki?

Cytat
Ale widzę tu znacznie więcej wad:
-pobranie danych w relacji na pewno jest mnie wydajne "SELECT imiona.imie FROM osoby,imiona WHERE osoby.id = 1 AND osoby.imie_id=imiona.id" VS "SELECT imie FROM osoby WHERE id = 1" musi być szybsze...

Ale pozostaje problem skalowalności i właśnie wydajności przeszukiwania. Masz np. portal społecznościowy i trzymasz rozbudowane opisy profili. Czy RDBMS szybciej wyszuka rekord w tabeli, w której jest sporo danych wykorzystywanych dość rzadko, czy gdy najpierw wyszuka odpowiednie rekordy i dopiero potem dołączy opisy?

Cytat
-widać też, że zapytanie jest dużo bardziej skomplikowane

To nie jest problem. Jeśli się wie, co się pisze i odpowiednio to formatuje, to nie jest problem. Tak samo, gdy żyjemy w erze ORM-ów.

Cytat
Są przypadki gdzie zapisanie danych w relacji wymaga dużo większego obciążenie dysku:
Gdy do bazy chcemy dodać osobę najpierw musimy sprawdzić czy jej imię i nazwisko jest w bazie i pobrać ich id, dopiero w tym momencie możemy dodać osobę. Gorzej jeżeli imienia lub nazwiska nie ma w bazie bo dochodzą kolejne zapytania "INSERT".

A czy kolega słyszał o indeksie UNIQUE i ON DUPLICATE KEY?
Go to the top of the page
+Quote Post
nospor
post
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
-pobranie danych w relacji na pewno jest mnie wydajne "SELECT imiona.imie FROM osoby,imiona WHERE osoby.id = 1 AND osoby.imie_id=imiona.id" VS "SELECT imie FROM osoby WHERE id = 1" musi być szybsze...
No jak ty chcesz tworzyć relacje z imion to nic dziwnego, że nie widzisz w tym sensu.... w tym przypadku to ja też nie widzę sensu (IMG:style_emoticons/default/wink.gif)
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




Cytat(nospor @ 8.08.2011, 11:08:30 ) *
No jak ty chcesz tworzyć relacje z imion to nic dziwnego, że nie widzisz w tym sensu.... w tym przypadku to ja też nie widzę sensu (IMG:style_emoticons/default/wink.gif)

W pełni się zgadzam. Równie dobrze mógłbyś stworzyć tabelę z nazwiskami i tabelę osób zrobić jako id_imienia oraz id_nazwiska. Byłoby to jak najbardziej poprawne z punktu widzenia normalizacji, ale kompletnie bezsensowne z logicznego punktu widzenia.

Relacje i więzy integralności mają tą cechę, że pomagają utrzymać spójność bazy danych. Mając np. tabelę z postami i z kategoriami oraz utworzoną relację baza danych nie pozwoli na przypisanie postu do kategorii, która nie istnieje. Relacjami możesz również wymusić kaskadową aktualizację lub usuwanie rekordów. Jeśli (w powyższym przykładzie) usuniesz daną kategorię to można automatycznie usunąć wpisy z nią powiązane.
Go to the top of the page
+Quote Post
thek
post
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




@phpion: czemu nielogiczne? A może wyszukiwarka po nazwiskach w jakimś serwisie genealogicznym (IMG:style_emoticons/default/smile.gif) Kwestia zastosowania relacji jest zawsze przecież płynna i zależna głównie od celu. O ile w większości przypadków masz rację co do bezsensu takiego podziału to będzie pewien odsetek, gdzie będzie to uzasadnione jakąś funkcjonalnością aplikacji, co może się dodatkowo zupełnie nie kłócić z pewną nadmiarowościa w innym miejscu. Czasem sensowne pod względem wydajności jest zastosować podwójne "zakombinowanie". Wprowadzanie danych tekstem dla choćby full text searcha i tabela w MyIsam a dodatkowo na etapie dodawania rekordu jeszcze skrypt bawiłby się z n-n. Sam tak robię w jednej bazie z systemem tagów. mam full text search na pole varchar z wszystkimi tagami artykułu, ale dla wydajności po stronie php mam jeszcze zabawę z relacją typu n-n dla nich. Wyszukiwarka po tagach więc śmiga szybko jak gepard na sterydach, ale i zwykła wyszukiwarka korzysta z tego co ktoś wpisał jako tagi bo jadę na full text searchu złożonym między innymi z tej kolumny. Nie wyobrażam sobie próby zrobienia szybkiej wyszukiwarki po tytule, treści i tagach artykułu, gdybym miał tylko ową relację n-n. UNION ciekawie by musiał wyglądać (IMG:style_emoticons/default/smile.gif)

Do autora. relacje są baaaardzo przydatne, ponieważ tak naprawdę w świecie wiele rzeczy ma ze sobą powiązania, w ten czy inny sposób. To nad czym powinniśmy jednak jako programiści pomyśleć, to na jakim stopniu złożoności i głębokości tych powiązań powinniśmy powiedziec "Stop! Dalej kombinować i dzielić/separować dane nie ma sensu." a do tego trzeba już doświadczenia i obycia z bazami danych oraz różnymi ich typami by wiedzieć gdzie co ma sens, a co nie i lepiej dac sobie spokój lub użyć innego rozwiązania. Dlatego nadmierna normalizacja jest tak samo bezsensowna jak jej olewanie. Trzeba naprawdę wiedzieć kiedy powiedzieć sobie "Dość". A tego żadna książka Cię nie nauczy tak naprawdę.
Go to the top of the page
+Quote Post
Rid
post
Post #6





Grupa: Zarejestrowani
Postów: 715
Pomógł: 47
Dołączył: 5.12.2010

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


Cytat
-widać też, że zapytanie jest dużo bardziej skomplikowane

To nie jest problem. Jeśli się wie, co się pisze i odpowiednio to formatuje, to nie jest problem. Tak samo, gdy żyjemy w erze ORM-ów.


Ja dostałem kiedyś od użytkownika z innego forum odpowiedź,że trzy proste kwerendy,są wydatniejsze niż jedna złożona kwerenda.
Nie wiem ,mogę być w błędzie,to są tylko moje dywagacje:- Jedno ,złożone zapytanie, dajmy na to z join lub z podzapytaniami select ,wykonują 2-3(więcej) operacji na bazie ,w tym samym czasie(w zależności od ilości podzapytań) to z logicznego punktu widzenia, wydaje mi się,że obciążenie procesora jak i zużycie pamięci wzrasta,ale mimo to zwracany wynik z takiej złożonej kwerendy będzie wypluwany szybciej niż z 3 osobnych zapytać,ale co jeśli będziemy używać dużo takich złożonych zapytań na stronie-czy to za bardzo nie obciąży procesora lub pamięci przez co w rezultacie nasza strona będzie działać wolniej?(IMG:style_emoticons/default/questionmark.gif)
Natomiast 3 proste zapytania-nie powinny obciążać procesora i pamięci,ale czas zwrócenia zapytania będzie zapewne dłuższy.

Poza tym wyczytałem w jednej z książek ,że struktura zaprojektowanej bazy danych jest wówczas dobra,gdy odwołujemy się
do niej poprzez jak najkrótsze i precyzyjne zapytania.

Podsumowując cytat ,to jest problem,gdyż wiąże się w jakimś stopniu z kwestią optymalności naszej bazy danych.

Ten post edytował Rid 8.08.2011, 15:57:12
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Ja dostałem kiedyś od użytkownika z innego forum odpowiedź,że trzy proste kwerendy,są wydatniejsze niż jedna złożona kwerenda.
To wszystko zależy. Nie można uogólniać. Może się okazać, że akurat jedno zapytanie będzie o niebo szybsze od trzech robiących to samo. Ale może się okazać zupełnie odwrotnie. Wszystko zależy od zapytań i struktury bazy.
Go to the top of the page
+Quote Post
Rid
post
Post #8





Grupa: Zarejestrowani
Postów: 715
Pomógł: 47
Dołączył: 5.12.2010

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


Cytat
Wszystko zależy od zapytań i struktury bazy


Myślę,że to jest odpowiedź na temat założony przez wszerada (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Pytanie było:
sens używania relacji

Moja odpowiedź, którą zacytowałeś, ma się nijak do tego pytania. Moja odpowiedź była kierowana na Twój post. Moją odpowiedzią było to, że zapytanie pomimo że jest złożone, nie oznacza, że będzie wolniejsze od 3 prostrzych. Może się okazać wręcz odwrotnie i często tak nawet jest.

Co do sensu relacji:
sens jest zawsze, nie wyobrażam sobie normalnej bazy bez relacji. Trzeba tylko umieć tworzyć relację z głową. Tak jak przykładowo przykład z imionami był tworzony bez głowy (IMG:style_emoticons/default/wink.gif)

A, i wykorzystanie relacji wcale nie oznacza, że zapytanie jest "złożone"
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 14:45