🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.php
Article #232437

Re: Symfony 4 - jak projektować bazę danych pod Doctrine?

#232437
From: Marek S
Date: Fri, 26 Apr 2019 22:37
123 lines
6688 bytes
W dniu 2019-04-26 o 09:32, Wojciech Bancer pisze:

>> BTW
>> Jak tworzysz podkreślenia? Próbowałem _ przed i za, próbowałem __ i
>> kiszka. Być może więcej wyrazowych wyrażeniach próbowałem. Nie pamiętam już.
> 
> Przez dodanie _ na początku i na końcu wyrazu (bez spacji).

Sprawdzam:
_test_
_dwa wyrazy_
_dwa_wyrazy_
_dwa-wyrazy_

> Wygląda jak klasyczna niepotrzebna optymalizacja.
> Zamieniasz też " na ', żeby zyskać 2 sekundy czasu serwera w rok?

Nie, wcale nie 2 sekundy. Pisałem wcześniej, że przy ok pół miliona 
operacji (w ciągu nocy) udało mi się zaoszczędzić 2h pracy serwera 
(50%). Może nawet więcej. Nie pamiętam konkretnych liczb.

A cała sprawa wzięła się stąd, że gdy parę lat temu, gdy system był 
tworzony, nie przewidywano takiego sukcesu firmy. Informatycy wychodzili 
dokładnie z tego samego założenia co Ty, że dla tych 10k operacji nie 
będą "nadmiernie" optymalizować. A potem, zaledwie po kilku latach 
obudzili się z ręką w nocniku: ojej... system się nie wyrabia przy 500k. 
Mało tego... zaczęły zdarzać się upadki bazy bo Ci sami informatycy 
założyli, że im więcej RAMu przydzielą w Postgresie na proces, tym, 
lepiej. Rano ludzie przychodzą do pracy a tu nic nie działa bo na bazie 
trwają niesłychane prace lub w ogóle leży.

Gdyby Ci informatycy wzięli się za uczciwą robotę i nawet dla 
niewielkiego początkowo przedsięwzięcia postąpili zgodnie z kunsztem 
programowania zwracając uwagę na detale, to problem wystąpiłby dopiero 
po dojściu do możliwości serwera a nie możliwości kiepskich algorytmów.


> Wszysktie? Nie. Nadmiarowe, stworzone "na wszelki wypadek"? Tak.
> To co robisz nosi wszelkie znamiona premature optimization i unnecessary
> optimization. Niby jest wydajnej, ale różnicy nikt tak realnie nie zobaczy,
> a Ty tracisz na tym czas.

Czytaj powyżej.
Za moją "stratę czasu" dostałem niezłą kasę bo skończyły się w/w 
problemy. Argument kasy mnie przekonuje dodatkowo do słuszności podejścia.

Co do w/w optymalizacji, to faktycznie praca była mrówcza. Np. zamiast 
indeksować całe pole typu array() należało rozbić indeks na dwa: 
przeindeksować tylko część tablicy - bo okazało się, że zdecydowana 
większość zapytań właśnie o te części pytała. Podobnie było z 
zapytaniami SQL. Zamiast jakiejś tam konstrukcji zastosowano inną i znów 
progress wydajnościowy. Tymczasem od początku można było zrobić to 
dobrze...

Zarobiłem na partactwie innych... Gdyby mieli tam ORMa, to po zdobyciu 
jego podstaw... zacząłem mieć wątpliwości czy w ogóle dałoby się 
cokolwiek uratować w w/w projekcie.

> Query builder *nie* jest żadnym łataniem, ani też żadnym SQLem.
> Jest narzędziem do budowania zapytań.
> Jak chciałbyś odpytywać bazę inaczej?

Raw SQL? Doctrine ma implementację czegoś takiego.

> Nie wszystko na bazie sprowadza się do robienia pojedynczych zapytań
> i działania na pojedynczych obiektach.
> 

Raw SQL ma JOINy od wieków.

> No nie. Query builder zbuduje zapytanie DQL:
> https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/dql-doctrine-query-language.html

...i baza to zrozumie? Nie sądzę. Zawsze na końcu będzie SQL. Resztę 
wypowiedzi dopiszę poniżej.


> 
> Uwalnie Ciebie od znajomości struktury (nazw kolumn kluczy, nazw tabeli),
> bo sam to ogarnia na podstawie otworzonej przez Ciebie relacji z obiektami
> Entities.
> 
> A potem ten DQL zostanie przetworzony na coś w stylu:
> DELETE FROM services s WHERE s.project_id = " . $project->getId(); // jeśli $project to obiekt
> DELETE FROM services s WHERE s.project_id = " . $project; // jeśli $project to prymityw (liczba lub string)

Czy to nie ja zadałem pytanie czy na wyjściu dostaniemy:
"DELETE FROM services s WHERE s.project=$project" ? :-D

Jakoś dostrzegam w tym podobieństwo :-D

> ale już bez Twojego udziału.
> Ale tak g gdzieś ostatecznie pod spodem jest wynik w postaci SQL.
> Przecież musi być, bazy danych inaczej nie gadają.

Właśnie! Kłopot jest jednak w tym, że zapytanie SQL jakie z tego się 
urodzi może (nie musi) wołać o pomstę do nieba. Tak jak to było przy 
UPDATE/DELETE. Nie twierdzę, bo jeszcze nie mam praktyki, ale flamastrem 
na tablicy napisałbym sobie tą rzecz jako wymagającą detalicznych 
obserwacji przy tworzeniu projektów by uniknąć wpadek.

> Zauważ, że:
>   - nie znasz tej nazwy tabeli (doctrine sam ją "ogarnia"
>     na podstawie tego jak zdefiniowałeś entity)
>   - do $project wstawiasz obiekt entity lub id, a doctrine
>     sam sobie poradzi z tym by to miało dla niego sens
>     sam też zna nazwę kolumny, na podstawie relacji jaka
>     była utworzona w entity

Tego nie musisz pisać. Ja to wiem i doceniam usprawnienie lecz w 
nielicznych / licznych / bardzo licznych przypadkach może stać się 
kamieniem u szyi.

Ja nie mogę powiedzieć klientowi: to nie ja spierniczyłem, to 
Querybuilder dodał gratisa od siebie w postaci mega-nieoptymalnej 
struktury. A indeksy w bazie? Po co to komu! Niech ORM sobie je ogarnia.

Jakbym dostał to takim komentarzu dyscyplinarkę, to wcale bym nie był 
zdziwiony.

-- 
Pozdrawiam,
Marek
Technical Details
Message-ID: <qa018c$7ip$1@node1.news.atman.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mail
References: <q9foak$p72$1@node2.news.atman.pl> <slrnqboo9s.e87.wojciech.bancer@pl-test.org> <5cbf10a8$0$482$65785112@news.neostrada.pl> <q9ngu2$rla$1@node2.news.atman.pl> <szccfmi95el5$.xlp4ie6tp398.dlg@40tude.net> <q9nrgf$d0c$1@node1.news.atman.pl> <slrnqbuueh.2ui0.wojciech.bancer@pl-test.org> <q9q6ee$a2s$1@node2.news.atman.pl> <slrnqc194m.2amm.wojciech.bancer@pl-test.org> <q9t7vj$4ol$1@node2.news.atman.pl> <slrnqc5d19.27vm.wojciech.bancer@pl-test.org>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mail
From: Marek S <precz@spamowi.com>
Newsgroups: pl.comp.lang.php
Subject: Re: Symfony 4 - jak projektować bazę danych
 pod Doctrine?
Date: Sat, 27 Apr 2019 00:37:53 +0200
Organization: ATMAN - ATM S.A.
Lines: 123
Message-ID: <qa018c$7ip$1@node1.news.atman.pl>
References: <q9foak$p72$1@node2.news.atman.pl> <slrnqboo9s.e87.wojciech.bancer@pl-test.org> <5cbf10a8$0$482$65785112@news.neostrada.pl> <q9ngu2$rla$1@node2.news.atman.pl> <szccfmi95el5$.xlp4ie6tp398.dlg@40tude.net> <q9nrgf$d0c$1@node1.news.atman.pl> <slrnqbuueh.2ui0.wojciech.bancer@pl-test.org> <q9q6ee$a2s$1@node2.news.atman.pl> <slrnqc194m.2amm.wojciech.bancer@pl-test.org> <q9t7vj$4ol$1@node2.news.atman.pl> <slrnqc5d19.27vm.wojciech.bancer@pl-test.org>
NNTP-Posting-Host: 89-70-94-204.dynamic.chello.pl
Mime-Version: 1.0
X-Trace: node1.news.atman.pl 1556318284 7769 89.70.94.204 (26 Apr 2019 22:38:04 GMT)
X-Complaints-To: usenet@atman.pl
NNTP-Posting-Date: Fri, 26 Apr 2019 22:38:04 +0000 (UTC)
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1
In-Reply-To: <slrnqc5d19.27vm.wojciech.bancer@pl-test.org>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit