Web Dev - Unde se stochează starea unui obiect de cumpărături?

Construiți o aplicație web. Trebuie să stocați starea pentru un obiect cum ar fi în timpul sesiunii unui utilizator.

Câteva note:

  • Acesta nu este exact un coș de cumpărături, ci mai degrabă un itinerar pe care utilizatorul îl construiește ... dar vom folosi cuvântul cart pentru acum b/c ppl referitor la acesta.
  • Nu vă interesează cărucioarele "abandonate"
  • Odată ce un cartuș este finalizat, îl vom persista la unele stocări de date de pe server pentru retrimire ulterioară.

Where do you store that stateful object? And how?

  • server (sesiune, db, etc?)
  • client (chei cookie-uri, obiect JSON cookie, câmp de formă ascuns, etc?)
  • alt ...

Update: It was suggested that I list the platform we're targeting - tho I'm not sure its totally necessary... but lets say the front-end is built w/ASP.NET MVC.

0

11 răspunsuri

Depozitați-o în baza de date.

0
adăugat

Am luat în considerare ceea ce sugerați, dar nu ați avut încă un proiect de client pentru al încerca. Cea mai apropiată este de fapt o listă de cumpărături pe care o puteți găsi aici ...

http://www.scottcommonsense.com/toolbox.aspx

Faceți clic pe Lista de verificare pentru a deschide fereastra. Utilizează ASPX, dar numai pentru a gestiona referințele JS plasate pe pagină. Restul se face prin intermediul AJAX folosind servicii web.

Anterior am construit un site ASP.NET 2.0 pentru un site de comerț care a folosit automat cookie-urile anon/auth. Fiecare vă oferă o valoare GUID pe care o puteți utiliza pentru a identifica un utilizator care este apoi asociat cu datele din baza dvs. de date. Am vrut cookie-urile auth pentru ca un utilizator să se poată muta la diferite computere; munca, casa etc. Am evitat folosirea câmpurilor Profil pentru a ține un obiect ShoppingBasket complex, care a fost popular în timp în toate cărțile ASP.NET 2.0. Nu am vrut să trateze probleme de serializare "magice", deoarece structura datelor sa schimbat în timp. Prefer să gestionez modificările schemelor db cu ajutorul scripturilor de actualizare/alterare sincronizate cu modificările software.

Cu cookie-urile anon/auth care identifică utilizatorul pe client, puteți utiliza partea client-side ASP.NET AJAX pentru a apela serviciile web de autentificare utilizând proxy-urile JS care vă sunt furnizate ca parte a ASP.NET. Trebuie să implementați API-ul de membru pentru a autentifica cel puțin utilizatorul. Restul implementării furnizorului poate arunca în siguranță un NotImplementedException. Apoi puteți utiliza propriile servicii personalizate ASMX web prin AJAX (consultați atributul ScriptReference) și actualizați paginile cu date de la server. Puteți să eliminați complet paginile ASPX și să utilizați doar static HTML/CSS/JS dacă doriți.

Cea mai mare atenție este scurgeri de memorie în JS. A rămâne pe aceeași pagină o lungă perioadă de timp crește potențialul dvs. problemă cu scurgeri de memorie. Este un risc pe care îl puteți minimiza prin testarea pentru sesiuni lungi și utilizând instrumente precum Firebug și altele pentru a căuta scurgeri de memorie. Utilizați instrumentul JS Lint precum și va ajuta la identificarea problemelor majore în timp ce mergeți.

0
adăugat
Îmi place această abordare, cu excepția faptului că probabil voi utiliza apelurile MVC și RESTful AJAX (returnarea JSON sau markup), astfel încât nu va trebui să vă faceți griji cu ASMX și ASPX cruft.
adăugat autor stevenharman, sursa

Dacă nu vă pasă de cărucioare abandonate și aveți lucruri în loc pentru cineva care se confruntă cu datele de pe partea clientului ... Cred că un cookie ar fi bine - mai ales dacă este doar un cookie de date JSON.

0
adăugat
Da, sunt de acord că într-adevăr depinde de cerințele aplicației dacă aceasta ar fi sau nu cea mai bună cale.
adăugat autor Ryan Lanciaux, sursa
Cookie-urile sunt limitate la 4K. Este posibil ca datele să nu fie suficiente, în funcție de mărimea coșului de cumpărături.
adăugat autor 64BitBob, sursa

Aș spune să stochez starea undeva pe server și să o coreleze cu sesiunea utilizatorului. În timp ce un modul cookie ar putea fi, probabil, un loc egal pentru a stoca lucrurile, dacă luați în considerare securitatea și dimensiunea datelor, păstrarea cât mai multor date pe server devine un lucru bun.

De exemplu, într-un set de terminale publice, ar fi bine ca cineva să privească conținutul cookie-ului și să vadă lista? Dacă da, cookie-ul este bine; dacă nu, veți dori doar un ID care să leagă utilizatorul de date. Acest lucru vă va permite, de asemenea, să vă asigurați că utilizatorul este autentificat pe site pentru a ajunge la acele date, mai degrabă decât să stocheze totul pe mașină - ar avea nevoie de o formă de acreditări precum și identificator.

Din perspectiva mărimii, sigur că nu vei fi prea preocupat de un cookie de 4K sau ceva pentru un utilizator de browser/bandă largă, dar dacă una dintre obiectivele tale este de a permite unui telefon mobil sau BlackBerry (nu pe 3G) să se conecteze și au o experiență rapidă (și nu se facturează pentru date), minimizarea cantității de date primite clientului va fi cheia.

Depozitarea serverului vă oferă, de asemenea, o anumită flexibilitate menționată în unele dintre celelalte răspunsuri - utilizatorul poate salva coșul de cumpărături pe o singură mașină și poate relua lucrul cu altul; poți lega coșul de cumpărături de o anumită formă de acreditare (mai degrabă decât de o sesiune tranzitorie) și persista căruța după ce utilizatorul și-a șters cookie-urile; veți obține un pic mai mult în ceea ce privește toleranța la erori - în cazul în care browser-ul utilizatorului se blochează, site-ul are în continuare datele sigure și sănătoase.

Dacă toleranța la erori este importantă, veți avea nevoie de un fel de magazin persistent ca o bază de date. Dacă nu, în memoria aplicației este probabil bine, dar veți pierde date dacă aplicația repornește. Dacă vă aflați într-un mediu de fermă, magazinul trebuie să fie accesibil la nivel central, așa că vă uitați din nou la o bază de date.

Indiferent dacă alegeți să tastați prin sesiune tranzitorie sau prin acreditări va depinde de faptul dacă utilizatorii își pot salva datele și se pot întoarce mai târziu pentru ao obține. Sesiunea tranzitorie va fi în cele din urmă curățată ca fiind "abandonată" și poate că e în regulă. Legarea la un profil de utilizator va permite utilizatorului să-și păstreze datele și să îl abandoneze în mod explicit. Oricum, aș folosi un fel de magazin de suport cum ar fi o bază de date pentru toleranța la erori și accesibilitatea centrală. (Sau poate că am oarengineering soluția?)

0
adăugat

Aș fi înclinat să îl stochez ca obiect de sesiune. Acest lucru se datorează faptului că nu sunteți preocupat de cărucioarele abandonate și, prin urmare, puteți elimina cheltuielile aferente stocării în baza de date, deoarece nu este necesar (să nu mai menționăm că veți avea nevoie, de asemenea, de o rutină de curățare pentru a elimina cărucioarele abandonate din baza de date ).

Cu toate acestea, dacă doriți ca utilizatorii să poată persista căruțele, opțiunea bazei de date este mai bună. În acest fel, un utilizator care este conectat va avea cosul salvat pe parcursul sesiunilor (atunci când se întorc pe site și se va autentifica, coșul lor va fi restabilit).

Ați putea folosi o combinație a celor două. Utilizatorii care vin la site utilizează în mod implicit cartușul bazat pe sesiuni. Când se conectează, toate elementele sunt mutate de la coșul bazat pe sesiuni la un cărucior bazat pe baze de date, iar orice activitate ulterioară a cărucioarelor este aplicată direct în baza de date.

0
adăugat
Cred că aceasta este o sugestie valabilă - cu excepția faptului că aș folosi mai degrabă date cookie pe partea clientului cu JSON decât sesiune ...
adăugat autor stevenharman, sursa
Cum rămâne cu limitele mărimilor cookie-urilor? Cum rămâne cu manipularea cookie-urilor? S-ar putea să fie bine pentru o listă, dar pentru un cărucior pare foarte bruște? Ce se întâmplă dacă schimbați schema de date?
adăugat autor Andrew Rimmer, sursa

Dacă este un interval de timp relativ scurt (aproximativ 2 ore, în funcție de configurația serverului dvs.) este OK pentru cărucior, atunci aș spune sesiunea de pe server. Este mai rapidă și mai eficientă decât accesarea DB.

Dacă aveți nevoie de o persistență mai lungă (să spunem că unii utilizatori preferă să plece și să se întoarcă a doua zi), atunci păstrați-l într-un cookie care este evident (utilizați criptarea sau hash-urile).

0
adăugat

Without knowing the platform I can't give a direct answer. However, since you don't care about abandoned carts, then I would differ from my colleagues here and suggest storing it on the client. Why store it in the database if you don't care if it's abandoned?
Then again, it does depend on the size of the object you're storing -- cookies have their limits after all.

Edit: Ahh, asp.net MVC? Why not use the profile system? You can enable an anonymous profile if you don't want to bother making them log in

0
adăugat

În DB legat de ceea ce utilizați pentru sesiuni (sesiuni db/memcache, cookie-uri semnate) sau către un utilizator autentificat.

0
adăugat
Nu poate fi nici macar un db (cel putin nu unul relational) ... :)
adăugat autor stevenharman, sursa
Stocați-l în magazinul de date "de la server" :). De ce aveți 2 magazine de date diferite? Stocarea serverului adaugă mai multă flexibilitate și securitate.
adăugat autor Andrew Rimmer, sursa

Dacă vă pasă de sprijinirea utilizatorilor fără activare Javascript, atunci sesiunile de pe server vă vor permite să utilizați rescrierea URL-urilor.

0
adăugat

Credeți că oamenii care au nevoie să poată porni pe o singură mașină (de exemplu, PC-ul de lucru), dar continuă/finsih de la o altă mașină (de exemplu, PC-ul de acasă)? Dacă da, răspunsul este evident.

0
adăugat
Acesta nu este un scenariu pe care intenționăm să îl sprijinim pentru utilizatorii anonimi - ceea ce îl putem sprijini pentru utilizatorii autentificați.
adăugat autor stevenharman, sursa

Aș folosi un cookie (criptat) pe clientul care deține ID-ul coșului de utilizatori. Dacă nu este un loc foarte ocupat, coșurile abandonate nu vor umple prea mult baza de date cu prea și puteți executa o sarcină de administrare obișnuită pentru a șterge ordinele abandonate dacă vă pasă foarte mult. De asemenea, făcând acest lucru, utilizatorul își va păstra ordinea în cazul în care închid browserul și va pleca, un coș în sesiune va fi șters în acest moment.

În cele din urmă, acest lucru înseamnă că nu trebuie să vă faceți griji cu privire la scrierea codului pentru a face față serializării datelor de pe un modul cookie de pe partea clientului, iar mai târziu vă faceți griji cu privire la punerea efectivă a acestor date în baza de date atunci când devine convertită într-o comandă puncte de eșec pentru gustul meu) ..

0
adăugat
JavaScript, România - Moldova
JavaScript, România - Moldova
328 participanți

Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @node_ro, @php_ro, @python_ro, @seo_ro, @RomaniaGroup, @ai_ro, @Grupuri_IT Offtop: @holywars_ro Joburi: @js_jobs_ro Sponsored with ❤️ by ciupacabra.com