Nietypowy koszyk zakupów oparty o tabele tymczasowe, Czy pomysł jest dobry? |
Nietypowy koszyk zakupów oparty o tabele tymczasowe, Czy pomysł jest dobry? |
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%) |
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 |
|
|
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 |
|
|
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%) |
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 |
|
|
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%) |
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. |
|
|
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 -------------------- |
|
|
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%) |
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. (raczej nikt nie ma tak długo otwartego okna przeglądarki na tej samej stronie)klucz: cart_[cart_id] wartość: zserializowany obiekt Cart czas_życia: np 5 godzin 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-? Ten post edytował Niktoś 18.12.2011, 00:59:43 |
|
|
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 |
-------------------- |
|
|
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%) |
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 |
|
|
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
-------------------- |
|
|
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%) |
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 |
|
|
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"? |
|
|
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%) |
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 Ten post edytował Niktoś 21.12.2011, 22:21:34 |
|
|
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? |
|
|
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%) |
Na takiej zasadzie klucz
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:
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 |
|
|
Wersja Lo-Fi | Aktualny czas: 25.04.2024 - 17:39 |