Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> procedury składowane - stosować czy nie ?
dejw
post 17.12.2009, 22:13:50
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 17.12.2009

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


Odpowiedzcie na pytanko: implementować logike aplikacji poprzez procedury składowane, czy nie??
Różnie piszą, że już sam nie wiem - mówią żeby stosować, bo to jednak bezpieczniejsze, upraszcza sprawe,
bo zamiast wysyłać kilka zapytań z PHP, to lepiej z PHP wywołać procedurę (mniej danych transferowanych) itp...,
a inni mówią że tego już się raczej nie stosuje (raczej logika tkwi w aplikacji, a nie po stronie bazy)...
Jestem początkujący i robię stronkę w PHP i MySQL i w sumie to nie wiem jak podejść do tematu - wysyłąć zapytania z phpa
czy napisac procedurki-wiem ze mozna zrobic tak i tak, ale chcialbym wiedzieć jak Waszym zdaniem jest najpoprawniej
i jak to wyglada w praktyce (jak najcześciej jest to implementowane w profesjonalnych projektach).
Dzieki z góry i pozdrawiam smile.gif
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
scanner
post 17.12.2009, 22:53:36
Post #2





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




My co prawda stosujemy PostgreSQL i pl/PgSQL - ale to akurat niczego nie zmienia.
Powiem Ci, że bez tego mechanizmu MyCRM nie miałby wielu funkcjonalności - już sama historia rekordów w bazie byłaby awykonalna z logicznego punktu widzenia - nasz system przechowuje całą historię zmian i usunięć na każdym z rekordów każdej z tabel - pisanie tego w PHP nawet dysponujac w miarę zaawansowanym narzędziem DB, jakim jest LightDB DeyV'a byłoby tak obciążające system, że powiesić by się szło.<br>Mój podsystem fakturujący tez w wielu przypadkach bez procedur by stał by się zbyt skomplikowany i zbyt zasobożerny.

Oczywiście nie do wszystkiego się da zaimplementować procedury, ale na pewno są bardzo przydatnym narzędziem - wyzwalacze przed, po... po prostu magia.
Powód edycji: [scanner]:


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
zzeus
post 18.12.2009, 08:15:17
Post #3





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

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


Z punktu bezpieczeństwa lepiej oprzeć aplikację o procedury, jednak z ekonomicznego punktu widzenia lepiej oprzeć aplikację o zapytania wywoływane w php. Wiąże się to głównie z tym że poprawa czy zmiana jakiejś logiki zawartej w procedurze jest bardzo kosztowna.

Ten post edytował zzeus 18.12.2009, 08:15:47


--------------------
Go to the top of the page
+Quote Post
scanner
post 18.12.2009, 13:07:03
Post #4





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Czym się różni przebudowa kodu PHP od przebudowy procedury, jeśli aplikacja jest dobrze zaprojektowana?


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
Mchl
post 18.12.2009, 17:28:47
Post #5





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


Różni się właściwie tym, że zamiast mieć całość logiki w jednym miejscu, ma się ją rozrzuconą po dwóch aplikacjach.

Inna trudność polega na tym, że aby zmienić kod procedury w MySQL, musisz ją najpierw skasować (i nie można tego zrobić w transakcji). Teoretycznie odstęp w czasie jest minimalny, ale przy obciążonej jest duże prawdopodobieństwo, że pojawią się odwołania do procedury której właśnie nie ma.

Niemniej jednak osobiście używam smile.gif
Go to the top of the page
+Quote Post
scanner
post 18.12.2009, 22:14:54
Post #6





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Dobrym nawykiem jest wyłączenie aplikacji na czas aktualizacji - szczególnie jeśli aktualizujemy strukturę bazy smile.gif


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
batman
post 18.12.2009, 23:03:16
Post #7





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




~dejw
Ciekawy temat poruszyłeś. Tak naprawdę nie ma złotego środka. Ja jestem zwolennikiem procedur w bazie danych. Jak wiadomo każde rozwiązanie ma swoje wady i zalety. Do wad można zaliczyć konieczność przepisywania dużej ilośći kodu w przypadku częstych modyfikacji bazy danych. Taka sytuacja ma miejsce, jeśli projekt, nad którym się pracuje, dopiero rodzi się w głowie klienta.
Główną zaletą tego rozwiązania jest przeniesienie ciężaru kosztownych operacji na serwer bazodanowy, czyli na maszynę, która do tego została kupiona. Jakoś nie wyobrażam sobie pisania kodu do obsługi drzew nested set w php/c#. O orzydatności triggerów chyba pisać nie muszę.

Cytat
Wiąże się to głównie z tym że poprawa czy zmiana jakiejś logiki zawartej w procedurze jest bardzo kosztowna.
Jakoś nie mogę znaleźć różnicy w kosztach. W obu przypadkach trzeba ten kod przepisać. Różnią się tylko narzędzia.

Cytat
Różni się właściwie tym, że zamiast mieć całość logiki w jednym miejscu, ma się ją rozrzuconą po dwóch aplikacjach.
W dużych systemach logikę masz rozrzuconą nie w dwa, a w dwadzieścia miejsc.

Cytat
Teoretycznie odstęp w czasie jest minimalny, ale przy obciążonej jest duże prawdopodobieństwo, że pojawią się odwołania do procedury której właśnie nie ma.
Po pierwsze:
Cytat
Dobrym nawykiem jest wyłączenie aplikacji na czas aktualizacji - szczególnie jeśli aktualizujemy strukturę bazy
A po drugie. Jeśli podmieniasz pliki na serwerze, czy to przez ftp/sftp, czy przy użyciu systemu kontroli wersji, to jest taki moment, gdy pliku nie ma (lub jest częściowo nadpisany). Przy dużym obciążeniu maszyny, ta chwila może trwać długo, a co za tym idzie, pokaże się biała strona.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
Mchl
post 18.12.2009, 23:15:46
Post #8





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


Zawsze można najpierw plik wgrać, a potem zmienić mu nazwę. Jest to oczywiście partyzantka, ale teoretyczna możliwość jest.

To co mnie boli w procedurach składowanych MySQL to właściwie ułomności samej implementacji języka. Np jeżeli chcę mieć procedurę, która wrzuci mi dane do tabeli tymczasowej o identyfikatorze wskazanym w parametrze, muszę zapytania składać w stringach i robić z nich zapytania przygotowane. W związku z czym w edytorze kolorowania składni nie mam, pomylić się łatwiej itp, itd.
Go to the top of the page
+Quote Post
batman
post 18.12.2009, 23:20:32
Post #9





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




W zasadzie problem sprowadza się do doboru odpowiedniego narzędzia. Nie pisałem zbyt dużo pod MySQL, ale nie pamiętam bym musiał kombinować coś z zapytaniami. Jeśli pojawia się taki problem, to zazwyczaj problemem jest nie kod, a błędne założenia projektowe.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
Mchl
post 19.12.2009, 00:26:45
Post #10





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


No niestety, u mnie założeniem jest "nazwa tabeli wynikowej podawana jest w parametrze do procedury". Inaczej musiałbym sobie dublować procedury z takim samym kodem. Z tego co wiem w MySQLu nie da się tego na razie zrobić inaczej, jak przez skonstruowanie zapytania przygotowanego.
Go to the top of the page
+Quote Post
dejw
post 21.12.2009, 11:52:46
Post #11





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 17.12.2009

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


Dzięki wielkie za odpowiedzi.
Powiedzcie jeszcze czy znajdę hosting oferujący obsługę procedurek składowanych w MySQL,
bo z tego co się zorientowałem, to może być problem...
Z góry dzięki za odpowiedź. smile.gif
i Wesołych Świąt wszystkim forumowiczom smile.gif
Go to the top of the page
+Quote Post
wookieb
post 21.12.2009, 11:58:18
Post #12





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




Cytat
Różni się właściwie tym, że zamiast mieć całość logiki w jednym miejscu, ma się ją rozrzuconą po dwóch aplikacjach.

To jest akurat zaleta chociażby w przypadku o którym wspomniał scanner. Ty zlecasz bazie danych pewne zadania, a skoro ona sama może zadbać o spójność pewnych danych to jest to jak najbardziej na plus. Oddzielasz od siebie logiki, które niekoniecznie muszą mieć ze sobą coś wspólnego.

Prosty przykład niekoniecznie ze świata phpowego.

Tworzysz interfejs i masz taki kod
Kod
var button:Button = new Button('Tytuł');

Kod wywołujący nie musi teraz dbać aby ten button był odpowiednio szeroki, wysoki, żeby czcionka była odpowiednia bo o to dla Button.
Tak samo z bazą. Zlecasz jej zmianę rekordu, a że w założeniu aplikacji jest by była przechowywana historia zmian to już nie tworzy jej php tylko sama baza. Takie zachowania są wręcz zalecane.

Ten post edytował wookieb 21.12.2009, 12:06:15


--------------------
Go to the top of the page
+Quote Post
Mchl
post 21.12.2009, 12:51:50
Post #13





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


To może być zaletą nie przeczę. Ale równie dobrze może być wadą, jeżeli w tym samym projekcie raz o to dba aplikacja, a raz baza danych. W idealnym świecie wszędzie jest porządek, w rzeczywistości zawsze ktoś zrobi bajzel.
Go to the top of the page
+Quote Post

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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 06:03