Piotr K.

Piotr K. Senior DevOps
Engineer

Temat: problem

Witam,
Mam taki problem.
W tabeli w bazie mam kolumne konto_aktywne(integer) i obok kolumne termin(typ data). Konto_aktywne przyjmuje dwie wartosci 0 lub 1. 0 konto nieaktywne, 1 konto aktywne. Teraz pojawia sie moj problem. Jesli dzisiejsza data jest wieksza od daty termin, to pole konto_aktywne powinno przejsc w stan 0. Daloby sie napisac taka funkcje na poziomie bazy danych? Czy lepiej zrobic to skryptem php, ktory by wykonywal sie powiedzmy raz dziennie i przelatywal przez wszystkie tabele sprawdzajac ta zaleznosc?

konto usunięte

Temat: problem

Na mysqlu słabo.
Napisz procedurę w sql i wywołuj ją z crona z odpowiednią częstotliwością, php niepotrzebne. Prosto i przyjemnie ;-)
Piotr K.

Piotr K. Senior DevOps
Engineer

Temat: problem

jasna sprawa, ze z crona ja wywolywac. Baza jest na postgresie. Myslalem tylko, ze daloby rade napisac funkcje na poziomie bazy danych w psql,ktora by to robila...
Wojciech K.

Wojciech K. realizator pomysłów
własnych

Temat: problem

Na mysqlu słabo.

gdyby to było na mysqlu, to:

CREATE EVENT costam ON SCHEDULE EVERY 1 MINUTE DO UPDATE tabela SET konto_aktywne=0 WHERE ....
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: problem

Postgres chyba też ma schedulera...

[google]

O kurcze... nie ma?
Robert B.

Robert B. Web Development
Manager

Temat: problem

Piotr K.:
Witam,
Mam taki problem.
W tabeli w bazie mam kolumne konto_aktywne(integer) i obok kolumne termin(typ data). Konto_aktywne przyjmuje dwie wartosci 0 lub 1. 0 konto nieaktywne, 1 konto aktywne. Teraz pojawia sie moj problem. Jesli dzisiejsza data jest wieksza od daty termin, to pole konto_aktywne powinno przejsc w stan 0. Daloby sie napisac taka funkcje na poziomie bazy danych? Czy lepiej zrobic to skryptem php, ktory by wykonywal sie powiedzmy raz dziennie i przelatywal przez wszystkie tabele sprawdzajac ta zaleznosc?

hmm...
a nie lepiej w PHP, przy każdym wyciąganiu informacji o userze sprawdzać czy aktywność konta się nie skończyła - jeśli by się skończyła, to robisz update do bazy.
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: problem

Robert Boguszewski:

hmm...
a nie lepiej w PHP, przy każdym wyciąganiu informacji o userze sprawdzać czy aktywność konta się nie skończyła - jeśli by się skończyła, to robisz update do bazy.

To właściwie można zrezygnować z pola 'aktywne' i tylko datę sprawdzać
Robert B.

Robert B. Web Development
Manager

Temat: problem

Michał Jarosz:
Robert Boguszewski:

hmm...
a nie lepiej w PHP, przy każdym wyciąganiu informacji o userze sprawdzać czy aktywność konta się nie skończyła - jeśli by się skończyła, to robisz update do bazy.

To właściwie można zrezygnować z pola 'aktywne' i tylko datę sprawdzać
Nie polecam takiego rozwiązania:
Primo: zapytanie "data1 < datab" jest wolniejsze niż "flaga = 1"
Secundo: zapytanie "data_wygasniecia < NOW()" nie będzie cachowane przez bazę - przynajmniej w mysql'u tak jest
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: problem

Ale skoro przy wyciąganiu informacji o userze i tak sprawdzamy datę?
Robert B.

Robert B. Web Development
Manager

Temat: problem

Michał Jarosz:
Ale skoro przy wyciąganiu informacji o userze i tak sprawdzamy datę?
Ale już po stronie aplikacji, kiedy i tak musielibyśmy ten rekord wyciągnąć (bo sprawdzamy ten warunek przy logowaniu).
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: problem

Szczerze mówiąc nie widzę różnicy.

Różnica za to pojawia się wtdy, kiedy chcemy na przykład zestawienie użytkoników z kontami aktywnymi/nieaktywnymi. Jeśli flagę aktualizujemy tylko przy logowaniu, to w takim zestawieniu użytkownicy z kontami 'przterminowanymi', ale którzy nie logowali się od tego czasu, wyświetlą się jako aktywni.
Piotr K.

Piotr K. Senior DevOps
Engineer

Temat: problem

chyba zostane przy skrypcie ktory to raz dziennie bedzie sprawdzal i ustawial kto ma aktywne kto nie, wrzuce do crona i po sprawie. Dzieki za wypowiedzi

konto usunięte

Temat: problem

Robert Boguszewski:
Michał Jarosz:
Robert Boguszewski:

hmm...
a nie lepiej w PHP, przy każdym wyciąganiu informacji o userze sprawdzać czy aktywność konta się nie skończyła - jeśli by się skończyła, to robisz update do bazy.

To właściwie można zrezygnować z pola 'aktywne' i tylko datę sprawdzać
Nie polecam takiego rozwiązania:
Primo: zapytanie "data1 < datab" jest wolniejsze niż
> "flaga = 1"
Secundo: zapytanie "data_wygasniecia < NOW()" nie będzie
> cachowane przez bazę - przynajmniej w mysql'u tak jest

Primo.
Jesteś pewny tego co piszesz?
Jakiego indeksu / engine'u to dotyczy?
Warunek "flaga = 1" w dobrym DBMS-sie może w ogóle nie być indeksowalny. Nie wiem jak w MySQLu, ale jeśli nawet, to taki warunek przy równomiernej dystrybucji jest mało filtrujący.

Jeszcze w 2005 takie rozwiązanie odradzali:
http://lists.mysql.com/mysql/181895

Secundo.
Ale takie "data_wygasniecia < '2009-11-23'" już jest.Piotr Likus edytował(a) ten post dnia 26.11.09 o godzinie 21:22

konto usunięte

Temat: problem

Wojciech K.:
Na mysqlu słabo.

gdyby to było na mysqlu, to:

CREATE EVENT costam ON SCHEDULE EVERY 1 MINUTE DO UPDATE tabela SET konto_aktywne=0 WHERE ....

Jak się ma 5.1 ;-)
Robert B.

Robert B. Web Development
Manager

Temat: problem

Piotr Likus:
Primo.
Jesteś pewny tego co piszesz?
Wbrew pozorom - jestem :-)
Jakiego indeksu / engine'u to dotyczy?
Trzymamy się MySQL'a.
Warunek "flaga = 1" w dobrym DBMS-sie może w ogóle nie być indeksowalny. Nie wiem jak w MySQLu, ale jeśli nawet, to taki warunek przy równomiernej dystrybucji jest mało filtrujący.

Jeszcze w 2005 takie rozwiązanie odradzali:
http://lists.mysql.com/mysql/181895
Ipso facto. Ale ja nie napisałem przecież, że będę zakładał taki index, poprostu operacje na 'prostszych' typach kolumn są szybsze (chyba, że się mylę). Index założył bym na dwóch kolumnach i jako drugą uwzględniając 'flagę'.

Secundo.
Ale takie "data_wygasniecia < '2009-11-23'" już
> jest.
Zgadza się, ale i tak 90% programistów pisze NOW(), bo mało kto zwraca uwagę na takie drobne szczegóły. Później strona wolno działa, dowiadujemy się, że jest coś takiego jak "slow query log" i oczy otwierają się szeeroko...

Podsumowująć (żebyśmy się nie wdali w akademickie dyskusje):
Jak to zrobić najlepiej ? Przypuszczalnie w Twoim przypadku najlepiej = najprościej. Przypuszczalnie nie musisz martwić się problemami wydajnościowymi, więc zrób tak jak to Ci będzie najwygodniej.
Zastanów się jakie zapytania będziesz robił do bazy najczęściej (logowanie usera, statystyki, przypomnienia o wygasającym koncie, etc.) i wtedy podejmiesz właściwą decyzję.
Weź też pod uwagę ograniczenia serwera na którym aplikacja będzie uruchamiana (możliwość uruchomienia crona, wersja mysql'a, itd.)

konto usunięte

Temat: problem

Michał Jarosz:
Postgres chyba też ma schedulera...

[google]

O kurcze... nie ma?

Jest coś takiego... się pgagent nazywa.
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: problem

Dodatki różne też znalazłem. Chodziło mi o wbudowanego.
Zresztą nie mam praktycznie żadnego doświadczenia z Postgresem. Może to taka filozofia.

konto usunięte

Temat: problem

Robert Boguszewski:
Piotr Likus:
Primo.
Jesteś pewny tego co piszesz?
Wbrew pozorom - jestem :-)
Jakiego indeksu / engine'u to dotyczy?
Trzymamy się MySQL'a.
Warunek "flaga = 1" w dobrym DBMS-sie może w ogóle nie być indeksowalny. Nie wiem jak w MySQLu, ale jeśli nawet, to taki warunek przy równomiernej dystrybucji jest mało filtrujący.

Jeszcze w 2005 takie rozwiązanie odradzali:
http://lists.mysql.com/mysql/181895
Ipso facto. Ale ja nie napisałem przecież, że będę zakładał taki index, poprostu operacje na 'prostszych' typach kolumn są szybsze (chyba, że się mylę). Index założył bym na dwóch kolumnach i jako drugą uwzględniając 'flagę'.

No w tym wypadku akurat (chyba) się mylisz.
Nie chcę być zgryźliwy, ale piszesz akurat coś w poprzek ogólnie przyjętej rzeczywistości.

Pytałem o to czy masz na myśli InnoDB czy MyISAM, czy indeks jest typu BTREE czy HASH czy RTREE... A może od którejś wersji indeksy b-tree zaczęły inaczej działać?
Wojciech K.

Wojciech K. realizator pomysłów
własnych

Temat: problem

Robert Boguszewski:
Nie polecam takiego rozwiązania:
Primo: zapytanie "data1 < datab" jest wolniejsze niż "flaga = 1"

to zależy od mechanizmu bazy tudzież od typu indeksów

(nawiasem mówiąc, w assemblerze x86 sprawdzanie warunku większy/mniejszy zajmowało o ile pamiętam mniej cykli procka niż warunku "czy równe" - z tego samego powodu w C w pętlach również było zalecane stosowanie przy sprawdzaniu warunku < a nie = może ta zasada nadal jest aktualna? ;) )
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: problem

Zalecane jest przede wszystkim zachowanie zdrowego rozsądku :)

Następna dyskusja:

Problem z php i excelem




Wyślij zaproszenie do