![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 555 Pomógł: 84 Dołączył: 20.02.2008 Skąd: Małopolska Ostrzeżenie: (0%) ![]() ![]() |
Witam,
chciałbym byście ocenili sposób, w który podchodzę do rozwiązania pewnego problemu. Jednak najpierw może go przedstawię: Stworzyłem dla użytkowników witryny możliwość zamieszczania ogłoszeń kupna różnych przedmiotów (Np. chcę kupić 2x Przedmiot1 płacąc 10 za sztukę). Tabelę od tego nazwałem market_offers, która zawiera takie pola jak (id, name, quantity, price), oraz kilka innych, które nie są teraz niezbędne. name -> nazwa przedmiotu (tutaj należy zauważyć że nazwa danego przedmiotu jest w bazie dla niego unikalna w innej tabeli, w której przechowuję dane przedmiotów). quantity -> ilość takich przedmiotów, które chcemy kupić. price -> cena za sztukę. Problem pojawia się natomiast przy sprzedaży przedmiotu. Załóżmy, że użytkownik posiada 40 egzemplarzy Przedmiotu2. Przy próbie ich sprzedaży, skrypt powinien wybrać z bazy danych 40 najwyższych ofert, i wyliczyć ile wspomniany user zarobi na sprzedaży. I tutaj pojawia się prawdziwy ćwiek - jak pobrać z bazy tyle rekordów by suma ich "quantity" była dokładnie 40 lub wyższa, szukając oczywiście najwyższych ofert wg. ceny. Można byłoby to zrobić dość prosto w PHP + MySQL, pobierając po jednym najwyższym rekordzie (coś a la "[...] LIMIT $actual_row, 1"). Jednakże uważam, że takie coś byłoby prawdziwym mordercą dla bazy danych, zwłaszcza, gdy oferty kupna będą oferowały niskie ilości przedmiotów, a dany użytkownik będzie chciał ich sprzedać naprawdę dużo. Pomyślałem więc -> napisze do tego procedurę w MySQL (i tutaj pojawia się pierwsze pytanie - czy dobrze podszedłem do tej sprawy odwołując się do procedur?) Po 4 godz pracy (tak, wiem, że czas śmieszny, ale jest to pierwsza procedura jaką napisałem w życiu), wyskrobałem wreszcie działający fragment kodu:
Przykład użycia:
Takie użycie powinno zwrócić w zmiennej @out (i tak rzeczywiście robi) ilość pieniędzy jakie dany użytkownik może otrzymać przy sprzedaży tych 30 przedmiotów. Teraz kilka pytań: Czy powyższa procedura jest poprawnie napisana? Czy może są w niej jakieś błędy powodujące niepotrzebnie zbytne obciążenie bazy? Czy wybrane przeze mnie podejście do tego problemu jest dobre? Z góry dziękuję za wszystkie odpowiedzi :-) Ten post edytował Skie 5.07.2010, 23:13:43 -------------------- Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+ Strona Domowa | Elradia MMORPG FireFox: make the web better. |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Jeżeli tak wygląda pl/sql w mysql, to ciesze się że nie używam tej bazy.
@EDIT a że się spytam, po cholerę Ci tam pętla w tym zapytaniu? Nie można zrobić tak: SELECT "price" * "in_quant" FROM "market_offers" WHERE name="', in_name, '"; ? Zresztą nie wiem o jakim danym użytkowniku piszesz, jak nie przesyłasz nigdzie id użytkownika więc nie ma jak pobierać cen dla danego użytkownika. W takim wypadku taka cena będzie dla każdego użytkownika. Poćwicz jeszcze trochę, nie rób nic na siłę. Ten post edytował cojack 7.07.2010, 05:06:33 -------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 02:02 |