Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nietypowy koszyk zakupów oparty o tabele tymczasowe
Forum PHP.pl > Inne > Hydepark
Niktoś
Witam chciałbym się spytać o Waszą opinię.Buduje koszyk już mam ,praktycznie zbudowany,wyliczanie sum itp.
Teraz kombinuje jak zapisać te dane,zastanawiam się nad tym z dobry tydzień i nie wiem czy dobrze kombinuje.
Zastanawiam się nad tabelami tymczasowymi i zapisywać te dane za pomocą procedur składowych.Jak wiadomo
tabela tymczasowa z przedrostkiem # trwa do czasu trwania sesji lub do zakończenia połączenia,czyli użytkownik zamyka przeglądarkę i dane giną.Jako ID tych danych użyłbym GUID sesji -podobno jest unikatowy dla każdej sesji.Ma to swoje zalety,nie kumuluje danych w bazie bo dane giną,nie są trwałe.Minusem przypadkowe zamkniecie przeglądarki przez usera i utrata danych.Ale mniejsza o te plusy i minusy.Można to wzbogacić i użyć globalnej tabeli tymczasowej z przedrostkiem ## wtedy dane usuną się kiedy ostatni użytkownik przerwie połączenie,lub zamknie przeglądarkę.Zapisać GUID do ciacha i nawet jak zamknie przeglądarkę i otworzy ponownie ,można odtworzyć z ciacha guid sesji i odtworzyć dane z tabeli tymczasowej(tylko należy pamiętać ,że będą one istnieć dopóki ostatni użytkownik nie przerwie połączenia).

Po uzupełnieniu koszyka i przy kliknięciu zapłąć , anonimowy user wypełnia dane-imie nazwisko ,swój adres itd.Po wypełnieniu formularza,robię zrzut z tabeli tymczasowej do tabeli normalnej,kluczem tych tabel byłby GUID, pola z wypełnionymi danymi z formularza+ osobna tabela z zakupionymi towarami, tylko czy numer GUID się nigdy nie powtórzy-czy jest unikalny?

Potrzebuje jakiejś podpowiedzi,cz rozwiązanie jakie chce zastosować jest do bani ,może są lepsze?
nasty
Cytat
tabela tymczasowa z przedrostkiem # trwa do czasu trwania sesji lub do zakończenia połączenia,czyli użytkownik zamyka przeglądarkę i dane giną

Nie do końca tak jest. Baza danych nie ma pojęcia o Twoich połączeniach z klientami serwera www. Tabele tymczasowe istnieją (zależnie od scope - Global lub local) do czasu aż skończy się wykonywać dany batch lub do czasu aż cokolwiek ma referencje na tą tabele po zakończeniu batcha.


Imho średni pomysł, będziesz miał za dużo kosztów administracyjnych i problemy z zapytaniami które wymagają dostęp do wszystkich koszyków (np wyciąganie statytyk, czyszczenie martwych koszykow, itd..).
Będziesz zmuszony do gimnastygowania się z dbo.master (o ile będziesz miał dostęp do tej tabeli - w co wątpię, jeśli nie będzie to Twój serwer) i generowania dynamicznego SQL-a co jest dosyć upierdliwe.

Jeśli już chcesz trzymać dane w tymczasowym miejsciu to trzymaj je w pamięci. Kiedyś (jakieś 5 lat temu z tego co pamiętam) nospor napisał klasę Cache, do której ja dodałem obsługę współdzielonej pamięci - możesz tamtego użyć. Powinno być na forum "Klasy, aglorytmy, itd.."
Niktoś
Z pamięcią też to nie za bardzo mi się widzi,bo bardziej służy do przechowywania danych statycznych,ale jeszcze przekopie,będę miał to na uwadze i przyjrzę się bliżej.
Cytat
Baza danych nie ma pojęcia o Twoich połączeniach z klientami serwera www

Faktycznie,źle to ująłem miałem na myśli czasu zerwania lub zakończenia("finalizacji")połączenia przez użytkownika.

Cytat
czyszczenie martwych koszykow
dane same się wyczyszczą w przypadku tabel tymczasowych jak sama nazwa mówi.

Cytat
(o ile będziesz miał dostęp do tej tabeli - w co wątpię, jeśli nie będzie to Twój serwer
Wogóle nie pisałbym o procedurach składowych jakby było inaczej.
O to chodzi ,że serwer będzie mój.
nasty
Cytat(Niktoś @ 18.12.2011, 01:09:31 ) *
Z pamięcią też to nie za bardzo mi się widzi,bo bardziej służy do przechowywania danych statycznych.

Dane statyczne? a "stan koszyka" nie jest jest danymy statycznymi w tym przypadku?

Cytat
dane same się wyczyszczą w przypadku tabel tymczasowych jak sama nazwa mówi.

W przypadku zakonczenia sesji - tylko tutaj musisz zrozumieć, że Twoja sesja:
"Grupowanie w logiczne jednostki, niezalezny requesty ktore maja podona wartosc w cisteczku o danej nazwie"
nie jest tym samym co sesja z baza danych - czyli zywot tego samego HANDLE po sronie server bazy danych z jego klientem.

Temu nie mozesz tego uzywac w ten sposob - beda Ci sie gubily koszyki.
wookieb
Relacyjna baza danych
2 tabele
- cart (id, id_sesji, ostatni_czas_uzycia, itd)
- cart_content (id, id_koszyka, id_produktu, itd)

W tle możesz odpalić menedżera (cron będzie OK), który co jakiś czas usunie niepotrzebne koszyki

Wg mnie idealnym rozwiązaniem będzie skorzystać z baz, które oferują dane ulotne. Np memcache w którym ustawiasz czas życia wpisu.
klucz: cart_[cart_id]
wartość: zserializowany obiekt Cart
czas_życia: np 5 godzin (raczej nikt nie ma tak długo otwartego okna przeglądarki na tej samej stronie)

Problem rozwiązuje się sam smile.gif
Niktoś
Cytat
Wg mnie idealnym rozwiązaniem będzie skorzystać z baz, które oferują dane ulotne. Np memcache w którym ustawiasz czas życia wpisu.
klucz: cart_[cart_id]
wartość: zserializowany obiekt Cart
czas_życia: np 5 godzin
(raczej nikt nie ma tak długo otwartego okna przeglądarki na tej samej stronie)

myślę ,że MSSQL takie coś ma,jeśli nie możnaby zainicjować poprzez sheduled menager'a -tylko ,że tego teraz nie zrobie bo pracuje na expresie tam tej opcji nie ma.

Nie wiem co miałeś na myśli :
wartość: zserializowany obiekt Cart-questionmark.gif?
Niktoś
Wiem co to serializacja,mam nawet gotowe klasy, do serializowania, i deserializowania,tylko jakby ją wykonać i co serializować.
Nie wiem co się ma kryć pod pojęciem obiekt Cart.Czy miałeś na myśli ,zgrupowanie wszystkich danych (obiekt card),zserializować i zapisać do komórki binary?
wookieb
Przechowałbym w nim identyfikatory produktów w koszyku, specjalne cechy produktów (ilość, rozmiar, kolory itd itd), łączna cena, id użytkownika. Wszystko to co przechowałbyś w 2 tabelach w relacyjnej bazie danych tongue.gif
Niktoś
Realizuje koncepcje z memcached.A mianowić dokonałem serializacji obiektów w którym znajduje się np ceny.
Do memcache zapisuje parę (klucz,zserializowany obiekt), robię to w taki sposób :
("kszyk",serializowany obiekt)-obiekt ma cena:20 ,cena2=30;cena3 =40; dodaje następny obiekt do mem cache:
("koszyk",serializowany obiekt)-obiekt ma cena:200 ; cena2:300 ;cena3:400; -no i wszystko fajnie się zapisuje do memcache(mam podgląd),liczba item:2 w memcachu.

Teraz próbuje na innej stronie odebrać dane:
Tworzę instancję klasy która jest serializowana i
MojaKlasa=(MojaKlasa)get("koszyk"); -rzutowanie na klasę serializacji;
I działa otrzymuje cena:200 ;cena2:300,cena3:400; gra gitara,tylko mam problem jak odzyskać ten pierwszy obiekt z cache,klucze są takie same,próbowałem przez foreach iterować serializowany obiekt,bez powodzenia,dostaje tylko dane z ostatniego zapisu do cache ,czy ktoś wie jak to zrobić?

Tyle się męczyłem ,żeby wdrożyć memcache a to się wydaje być jeden wielki nie wypał.
can't iterate all the items in memcached.
Czyli jak mamy taki same klucze o innych wartościach to się za chiny nie odwołamy do tych wartości tylko pokaże ostatni wpis.
Tak więc mamy 2 lub milion itemów w memycachu o tym samym kluczu i innych wartościach z czego tylko jeden możemy wydobyć to się nazywa ekonomia.
To się nawet do AppFabric nie umywa.Listy na memcachu to ja na pewno nie zrobię.Żałosne.
destroyerr
Cytat
Memcached is an in-memory key-value store

Klucz-wartość więc jak chcesz na tym zrobić listę? Skąd pomysł żeby jako klucz stosować string "koszyk"?
Niktoś
To robiłem dla próby ,a jaki klucz miałbym generować-GUID?To i tak nic nie da.Żeby zastosować memcache musiałbym generować dynamicznie klucze i gdzieś je przypisać np.do BazyDanych, to jest bez sensu.Wydobywać z bazy danych klucze i dopiero robić iteracje.Klucze muszą być unikalne,gdyż na takich samych sobie nie popracujemy,tylko zastanawia mnie dlaczego dali możliwość dodawania tych samych kluczy do memcache jak nie można nic z nimi zrobić-to bezmyślne zapychanie pamięci.
Znalazłem dużo lepsze rozwiązanie już zdążyłem je zaaplikować teraz na nim trenuje,nazywa się SQLSpaces,jest trochę gorszę od Redisa, mało popularne ,słaba dokumentacja,ale przynajmniej nie jest postawione na Cygwinie tak jak Redis, ma zabezpieczenia na port w przeciwieństwie do MemCached -można użyć SSL,a ,użyć nazwy i hasła użytkownika ,prawdopodobnie można itterować obiekty(dopiero co wdrożyłem).


Ech jak tak dalej pójdzie to przejdę chyba wszystkie technologie brzydal.gif
destroyerr
Cytat
tylko zastanawia mnie dlaczego dali możliwość dodawania tych samych kluczy do memcache jak nie można nic z nimi zrobić-to bezmyślne zapychanie pamięci.

Chyba nie przepadasz za czytaniem dokumentacji.

Cytat
Jako ID tych danych użyłbym GUID sesji -podobno jest unikatowy dla każdej sesji.

Cytat
To robiłem dla próby ,a jaki klucz miałbym generować-GUID?To i tak nic nie da.Żeby zastosować memcache musiałbym generować dynamicznie klucze i gdzieś je przypisać np.do BazyDanych, to jest bez sensu.

Ciężko mi sobie wyobrazić jak to może działać inaczej. Chciałbyś mieć listę koszyków i na jakiej zasadzie przypisywałbyś je do użytkowników?
Niktoś
Na takiej zasadzie klucz
  1. GUId-> Obiekt1
  2. Obiekt2
  3. Obiekt3
  4. Obiekt4


Guid-brałbym z sesji.
Odwołując się do klucza pobrać wszystkie obiekty,tego w memcached nie da rady zrobić,albo nie umiem.
Odnośnie dokumentacji,co innego piszą a co innego jest jak mówiłem miałem możliwość podejrzenia itemów w memcachu i każdy request dodawał kolejny obiekt-stare obiekty chyba czekały sobie na wygaśnięcie.
Zeby zrobić to w memcached musiałbym zrobić taki schemat:
  1. Klucz wartość
  2. Id1 Obiekt1
  3. Id2 Obiekt2
  4. Id3 Obiekt3
  5. Id4 Obiekt4
  6. IdN ObiektN


I teraz do sesi przypisać klucze i dopiero iterować.



No i się udało -cel osiągnięty ,da rady iterować po zbiorach.Ułatwiło mi to sprawę-schemat będzie wyglądał naprawdę prościej.
Nie polecę ,bo za krótko w tym robię ale, dla zainteresowanych podaje:
http://sqlspaces.collide.info/otherlanguages.html -dla PHP również jest implementacja i równie dobra.Myślę ,że to jest to czego szukałem funkcjonalne i bezpieczne.
Temat uważam za rozwiązany.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.