Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Przechować w sesji czy ponownie zapytać bazę?

Załóżmy, że mam jakąś tabelę z danymi klienta. Wyciągam sobie na podstawie id te dane na jednej podstronce i je wyświetlam. Potem klikam na np. przycisk i przechodzę do następnej podstronki, gdzie też te dane chcę wyświetlić.

Pytanie: Czy na tej drugiej podstronie ponownie zapytać bazę o te dane (nie jest ich wiele) czy przechować je w sesji i wyświetlić?

konto usunięte

Temat: Przechować w sesji czy ponownie zapytać bazę?

Oczywiście w sesji. ale tutaj jest haczyk jeżeli użytkownik zaloguje się na dwóch przeglądarkach jednocześnie (np ff i ie) i zedytuje sobie dane (np w ff) to w ie będzie widział stare bo będzie miał je w sesji.
Daniel Jurak

Daniel Jurak analityk
programista,
architekt danych PKO
BP SA

Temat: Przechować w sesji czy ponownie zapytać bazę?

nie wiem jakie dane wyswietlasz, ale ja bym odpytał baze.
jesli sie okaze ze w miedzyczasie dane ulegly zmianie, np. zmniejszyla sie jakas wartosc (bo cos tam w systemie sie naliczylo),
to bedziesz wyswietlal niepoprawne dane z sesji.

konto usunięte

Temat: Przechować w sesji czy ponownie zapytać bazę?

Jak dla mnie to zależy co to za strona. Jak baza obciążona to sesja (i tak nie znam osoby co na 2 przeglądarkach chodzi po 1 stronie - mówię o zwykłych użytkownikach) natomiast jak jest to jakiś mały serwis to śmiało odpytuj bazę.

konto usunięte

Temat: Przechować w sesji czy ponownie zapytać bazę?

Daniel Jurak:
nie wiem jakie dane wyswietlasz, ale ja bym odpytał baze.
jesli sie okaze ze w miedzyczasie dane ulegly zmianie, np. zmniejszyla sie jakas wartosc (bo cos tam w systemie sie naliczylo),
to bedziesz wyswietlal niepoprawne dane z sesji.

Ja to robię np. tak.:
Przechowuje dane użytkownika w sesji, a gdy mi potrzeba dodatkowych danych (np. w postaci obiektu Doctrine), to sobie je pobieram z bazy danych, np.:



/**
* @var Person_Client
*/
protected $_logged_user = null;

$this->_identity = Zend_Auth::getInstance()->getIdentity();

/**
* Coś na wzór factory method
*/
protected function _fetchLoggedUser()
{
if ($this->_identity) {

if ($this->_logged_user == null) {
$user_table = Doctrine::getTable('Person_Client');
/* @var $user_table Person_ClientTable */

$this->_logged_user = $user_table->find($this->_identity->id);
}

return $this->_logged_user;
}
else {
return null;
}
}


Mam nadzieję, że pomoże.
Kod oparty na Zend Framework i Doctrine, ale logika powinna działać dla każdej aplikacji.Łukasz Bandzarewicz edytował(a) ten post dnia 06.11.08 o godzinie 14:19
Adam W.

Adam W. senior php
developer, Symfony

Temat: Przechować w sesji czy ponownie zapytać bazę?

ja bym pobierał dane z bazy za każdym razem. przydatne jest to w sytuacji gdy użyszkodnik coś psuje, wtedy admin zmienia mu szybko status i już nic nie może zepsuć bo w zapytaniu jest warunek, że status musi być = 1.
w sesji miałby zapisane cały czas 1 i mógłby dalej broić.

konto usunięte

Temat: Przechować w sesji czy ponownie zapytać bazę?

Adam W.:
ja bym pobierał dane z bazy za każdym razem. przydatne jest to w sytuacji gdy użyszkodnik coś psuje, wtedy admin zmienia mu szybko status i już nic nie może zepsuć bo w zapytaniu jest warunek, że status musi być = 1.
w sesji miałby zapisane cały czas 1 i mógłby dalej broić.

Też się to da ustawić. Dla mnie z czystej wygody wygrałaby baza danych. Łatwiej później jest zlokalizować co za co odpowiada i co gdzie jest przetrzymywane.
Krzysztof P.

Krzysztof P. Programista, Team
Leader

Temat: Przechować w sesji czy ponownie zapytać bazę?

Moim zdaniem powinieneś pobierać z bazy, jest parę powodów.
Co do obciążenia, to cache powinien być między samą bazą a aplikacją, ale to jest rozwiązanie jeśli na prawdę potrzeba dużej wydajności.
Zresztą kiedyś na blogu technicznym Grona było podane jak oni to rozwiązują, co prawda wykorzystywali dekoratory z Python, ale chodzi mi o samą zasadę działania.
Czyli pobierasz z bazy, jeśli jest ona przeciążona to dodajesz system cache między bazą a aplikacją.
(nie wnikam głębiej w rozwiązania)
Adam W.

Adam W. senior php
developer, Symfony

Temat: Przechować w sesji czy ponownie zapytać bazę?

Rafał Kociatkiewicz:
Adam W.:
ja bym pobierał dane z bazy za każdym razem. przydatne jest to w sytuacji gdy użyszkodnik coś psuje, wtedy admin zmienia mu szybko status i już nic nie może zepsuć bo w zapytaniu jest warunek, że status musi być = 1.
w sesji miałby zapisane cały czas 1 i mógłby dalej broić.

Też się to da ustawić. Dla mnie z czystej wygody wygrałaby baza danych. Łatwiej później jest zlokalizować co za co odpowiada i co gdzie jest przetrzymywane.

chodzi Ci o modyfikowanie danych w sesji poszczególnego użytkownika? czy czyszczenie sesji kiedy zmieniane są dane w bazie?

konto usunięte

Temat: Przechować w sesji czy ponownie zapytać bazę?

Adam W.:
Rafał Kociatkiewicz:
Adam W.:
ja bym pobierał dane z bazy za każdym razem. przydatne jest to w sytuacji gdy użyszkodnik coś psuje, wtedy admin zmienia mu szybko status i już nic nie może zepsuć bo w zapytaniu jest warunek, że status musi być = 1.
w sesji miałby zapisane cały czas 1 i mógłby dalej broić.

Też się to da ustawić. Dla mnie z czystej wygody wygrałaby baza danych. Łatwiej później jest zlokalizować co za co odpowiada i co gdzie jest przetrzymywane.

chodzi Ci o modyfikowanie danych w sesji poszczególnego użytkownika? czy czyszczenie sesji kiedy zmieniane są dane w bazie?

Myślałem o dorzuceniu dodatkowej danej determinującej jakie użytkownik ma uprawnienia(w sesji) i w razie potrzeby zmiany tego. Hmmm to by było kombinowania (baza o wiele wygodniejsza:D)
Adam W.

Adam W. senior php
developer, Symfony

Temat: Przechować w sesji czy ponownie zapytać bazę?

Rafał Kociatkiewicz:
Adam W.:
Rafał Kociatkiewicz:
Adam W.:
ja bym pobierał dane z bazy za każdym razem. przydatne jest to w sytuacji gdy użyszkodnik coś psuje, wtedy admin zmienia mu szybko status i już nic nie może zepsuć bo w zapytaniu jest warunek, że status musi być = 1.
w sesji miałby zapisane cały czas 1 i mógłby dalej broić.

Też się to da ustawić. Dla mnie z czystej wygody wygrałaby baza danych. Łatwiej później jest zlokalizować co za co odpowiada i co gdzie jest przetrzymywane.

chodzi Ci o modyfikowanie danych w sesji poszczególnego użytkownika? czy czyszczenie sesji kiedy zmieniane są dane w bazie?

Myślałem o dorzuceniu dodatkowej danej determinującej jakie użytkownik ma uprawnienia(w sesji) i w razie potrzeby zmiany tego. Hmmm to by było kombinowania (baza o wiele wygodniejsza:D)

otóż to.
hmm chociaż jak sobie tak myślę o Symfony to tam też nie da się tego łatwo zmienić. chodzi mi o Credentials. dodajesz userowi jakieś uprawnienie podczas logowania, ale admin nie może tego zmienić w czasie gdy user baraszkuje po serwisie.
dlatego najlepiej jest pobierać za każdym razem dane z tabeli profil - tam jest kolumna status, która usera upoważnia do działania lub nie. chyba nie ma co więcej kombinować i dyskutować:)
Alan Gabriel B.

Alan Gabriel B. Software Engineer,
IFX

Temat: Przechować w sesji czy ponownie zapytać bazę?

Adam W.:
ja bym pobierał dane z bazy za każdym razem. przydatne jest to w sytuacji gdy użyszkodnik coś psuje, wtedy admin zmienia mu szybko status i już nic nie może zepsuć bo w zapytaniu jest warunek, że status musi być = 1.
w sesji miałby zapisane cały czas 1 i mógłby dalej broić.

Piszecie jakby synchronizacja tych danych była jakaś niemożliwa do wykonania.

Zazwyczaj zmianę własnych danych robi się w 1-2 akcjach i tam prócz zapisywania danych do bazy można zsynchronizować je z sesją et voila - problemów już nie ma.

edit:

Zależy też to od typu aplikacji (jak zrobione jest ACL i system dynamicznych uprawnień) i drivera sesji - bo jeżeli driver też oparty o bazę, to ja nie widzę sensu wtedy zapisywać czegokolwiek do sesji, co jest dostępne w standardowych tabelach bazy - czyli dane usera nie, ale dane wielostronicowych formularzy tak, żeby nie było.Alan B. edytował(a) ten post dnia 08.11.08 o godzinie 06:55

Temat: Przechować w sesji czy ponownie zapytać bazę?

Alan ale jak zmienisz cos w sesji usera jezeli Ty jako admin zmienisz mu jakies parametry w profilu?
Adam W.

Adam W. senior php
developer, Symfony

Temat: Przechować w sesji czy ponownie zapytać bazę?

Michal Modorski:
Alan ale jak zmienisz cos w sesji usera jezeli Ty jako admin zmienisz mu jakies parametry w profilu?

można kombinować jeżeli dane sesji zapisywane są w bazie. ale to się mija z celem wtedy:)
Filip Czapeczka

Filip Czapeczka Senior Project
Manager

Temat: Przechować w sesji czy ponownie zapytać bazę?

Do takich rzeczy zazwyczaj służy memcache, ktory trzyma w ramie wszystkie potrzebne informacje w odpowiednich kluczach. Jeżeli naprawdę uważasz, że będziesz miał dużo zapytań o te dane to jak dla mnie sesja, czy tez baza nie sa dobrym rozwiazaniem. sesja zazwyczaj jest trzymana na dysku twardym (ew. w memcache'u, i jezeli tak jest w tym przypadku, to uzylbym tymbardziej memcache'a, a nie sesji). Memcache jednak może być overkillem, jeżeli te dane są potrzebne jedynie do odczytu, może mógłbyś pomyśleć o ciasteczku - jednak wtedy cały czas możesz mieć problem ze zmianą danych w innym miejscu. Wszystko tak naprawdę zależy od Twoich potrzeb i przewidywanego i/o do bazy.

W każdym razie na pewno możesz zacząć od bazy i w razie kłopotów z ilością zapytań przejść na sesję, jednak później możesz mieć przez to kłopoty z i/o do dysku, i bedziesz musial pomyśleć o czymś innym, itd itd :)
Alan Gabriel B.

Alan Gabriel B. Software Engineer,
IFX

Temat: Przechować w sesji czy ponownie zapytać bazę?

Michal Modorski:
Alan ale jak zmienisz cos w sesji usera jezeli Ty jako admin zmienisz mu jakies parametry w profilu?

Zaasekurowałem się tym drugim akapitem :>

edit:

oraz ile razy admin zmienia dane personalne etc?

Uprawnienia zawsze powinny być ładowane, bo inaczej nie jest bezpiecznie, ale takie rzeczy jak nazwa ekranowa itd (Witaj, xyz - zostałeś zalogowany.) moim skromnym zdaniem mogą być w sesji.

Jak pisałem, to zależy od typu aplikacji.Alan B. edytował(a) ten post dnia 08.11.08 o godzinie 16:40

konto usunięte

Temat: Przechować w sesji czy ponownie zapytać bazę?

Niezaleznie od tego, czy strona bedzie mocno obciazona, czy nie - dane powinne byc zasysane z bazy.

Trzymanie w sesji tabeli, to dla mnie sredni pomysl.

Jesli sie okaze, ze masz spore obciazenie - robisz cache i po klopocie. A czy uzyjesz cachowania do plikow, czy memcachea, czy innego talatajstwa - wybor nalezy do Ciebie. Takze bramka nr 1, 2, czy moze 3? ;p

Kolejna sprawa, ze z bazami w przypadku problemow z przeciazeniem, zawsze mozesz dolozyc kolejne serwery, spiac je i rozlozyc obciazenie na pare maszyn :)Piotr Pryga edytował(a) ten post dnia 09.11.08 o godzinie 10:28
Alan Gabriel B.

Alan Gabriel B. Software Engineer,
IFX

Temat: Przechować w sesji czy ponownie zapytać bazę?

Piotr Pryga:
/ciach/

"Moim zdaniem!" jedynym słusznym cachem jest cache widoku, a nie danych. Wtedy sesja jest jak najbardziej na miejscu - w końcu została do Tego stworzona. A nie trzymać tylko identyfikator użytkownika (bo wtedy to marnotrawstwo fjuczera jakim jest sesja).

Cache danych tworzy niepotrzebne i skomplikowane powiązania, które trudno zreprodukować w cache widoku, a jeżeli już to są łatwiejsze w zarządzaniu w typowym MVC.

konto usunięte

Temat: Przechować w sesji czy ponownie zapytać bazę?

Rafał Grzegorek:
Załóżmy, że mam jakąś tabelę z danymi klienta. Wyciągam sobie na podstawie id te dane na jednej podstronce i je wyświetlam. Potem klikam na np. przycisk i przechodzę do następnej podstronki, gdzie też te dane chcę wyświetlić.

Pytanie: Czy na tej drugiej podstronie ponownie zapytać bazę o te dane (nie jest ich wiele) czy przechować je w sesji i wyświetlić?

sesja, sesja, sesja.. ;]

konto usunięte

Temat: Przechować w sesji czy ponownie zapytać bazę?

Alan B.:
Piotr Pryga:
/ciach/
Cache danych tworzy niepotrzebne i skomplikowane powiązania, które trudno zreprodukować w cache widoku, a jeżeli już to są łatwiejsze w zarządzaniu w typowym MVC.

Cache danych jest jak najbardziej na miejscu, o ile baza nie siedzi na tym samym serwerze co serwer WWW, a i wtedy warto cachować - jeśli w stronie wykorzystujemy kilkanaście razy to samo zapytanie.

Ale cache <> sesja, bo sesja nie ma mechanizmów kontroli integralności bazy.

Odpowiedź na pierwotne pytanie: baza. Sesja to jak dodatkowe, rozsynchronizowane źródło danych, które pierwotnie są w bazie.
Jeśli założymy, że te dane podczas trwania sesji się nie zmieniają, to i tak takie założenie w którymś momencie zwykle trzeba będzie obalić...

Następna dyskusja:

autoryzacja PHPAUTH - czy j...




Wyślij zaproszenie do