Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Nietypowy koszyk zakupów oparty o tabele tymczasowe, Czy pomysł jest dobry?
Niktoś
post 17.12.2011, 19:47:49
Post #1





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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?

Ten post edytował Niktoś 17.12.2011, 20:00:03
Go to the top of the page
+Quote Post
nasty
post 18.12.2011, 00:02:36
Post #2





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


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.."

Ten post edytował nasty 18.12.2011, 00:03:46
Go to the top of the page
+Quote Post
Niktoś
post 18.12.2011, 00:09:31
Post #3





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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.

Ten post edytował Niktoś 18.12.2011, 00:30:15
Go to the top of the page
+Quote Post
nasty
post 18.12.2011, 00:39:34
Post #4





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


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.
Go to the top of the page
+Quote Post
wookieb
post 18.12.2011, 00:51:22
Post #5





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




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


--------------------
Go to the top of the page
+Quote Post
Niktoś
post 18.12.2011, 00:59:21
Post #6





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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?

Ten post edytował Niktoś 18.12.2011, 00:59:43
Go to the top of the page
+Quote Post
wookieb
post 18.12.2011, 01:00:52
Post #7





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




http://pl.php.net/serialize
http://pl.php.net/serializable


--------------------
Go to the top of the page
+Quote Post
Niktoś
post 18.12.2011, 01:05:53
Post #8





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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?

Ten post edytował Niktoś 18.12.2011, 01:11:16
Go to the top of the page
+Quote Post
wookieb
post 18.12.2011, 01:09:51
Post #9





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




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


--------------------
Go to the top of the page
+Quote Post
Niktoś
post 21.12.2011, 18:20:40
Post #10





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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.

Ten post edytował Niktoś 21.12.2011, 18:37:15
Go to the top of the page
+Quote Post
destroyerr
post 21.12.2011, 21:31:18
Post #11





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


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"?
Go to the top of the page
+Quote Post
Niktoś
post 21.12.2011, 22:20:03
Post #12





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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

Ten post edytował Niktoś 21.12.2011, 22:21:34
Go to the top of the page
+Quote Post
destroyerr
post 21.12.2011, 23:03:28
Post #13





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


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?
Go to the top of the page
+Quote Post
Niktoś
post 22.12.2011, 00:46:23
Post #14





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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.

Ten post edytował Niktoś 22.12.2011, 00:49:04
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: 25.04.2024 - 17:39