Jak zrobić, aby baza danych usuwała rekord po jakimś czasie?

Odpowiedz Nowy wątek
2019-09-15 13:03
0

Witam,
Jak mogę zrobić, aby baza danych usuwała rekord po jakimś czasie? Załóżmy, że mam sklep i chcę, aby każdy dodany przez użytkownika produkt mógł być w nim przez max 1h. I nie wiem jak po tej godzinie usunąć produkt. Mógłbym zrobić, aby po odpaleniu strony przez pierwszego użytkownika po 1h od razu usuwało rekord, ale czy takie coś jest praktyczne? Czy nie da się tego lepiej zrobić?

brzmi jakbyś potrzebował crona, ale może są lepsze sposoby - sugar_hiccup 2019-09-15 13:14
Brzmi jakby potrzebował zrobić koszyk przechowywany w sesji... Ale co ja tam wiem.... - axelbest 2019-09-15 13:48

Pozostało 580 znaków

2019-09-15 13:20
0

Używasz systemowego "terminarza" czyli schedulera. Albo robisz sobie task wykonywany w PHP powiedzmy co minutę albo nawet bezpośrednio na bazie.
https://dev.mysql.com/doc/refman/8.0/en/events-overview.html
Powyższy link opisuje jak to wygląda dla windows i Linux i daje pojęcia o jakich poczytać.

Pozostało 580 znaków

2019-09-15 13:36

Może lepiej po prostu zrobić dodatkowe pole np. "expired_at" (typu DATETIME) i ustawiać ją podczas dodawania rekordu, a na stronie wyświetlać tylko te rekordy które są "aktywne".

Zawsze lepiej mieć rekordy w bazie, nawet jeżeli teoretycznie już ich nie potrzebujemy. Oczywiście, jeżeli chodzi o optymalizację lepiej ich nie mieć (jeżeli będziesz ich miał w setkach tysięcy/milionach), ale wtedy możesz zrobić dodatkową tabelę np. "produkty zarchiwizowane" i tam przenosić te które już nie są aktywne jakimś cronem.

Pozostało 580 znaków

2019-09-15 13:48
0

Nie możesz zrobić tego koszyka w sesji?

Pozostało 580 znaków

2019-09-15 13:49
0
axelbest napisał(a):

Nie możesz zrobić tego koszyka w sesji?

Niestety, ale nie robię koszyka ;)

Pozostało 580 znaków

2019-09-15 13:50
0
Markuz napisał(a):

Może lepiej po prostu zrobić dodatkowe pole np. "expired_at" (typu DATETIME) i ustawiać ją podczas dodawania rekordu, a na stronie wyświetlać tylko te rekordy które są "aktywne".

Zawsze lepiej mieć rekordy w bazie, nawet jeżeli teoretycznie już ich nie potrzebujemy. Oczywiście, jeżeli chodzi o optymalizację lepiej ich nie mieć (jeżeli będziesz ich miał w setkach tysięcy/milionach), ale wtedy możesz zrobić dodatkową tabelę np. "produkty zarchiwizowane" i tam przenosić te które już nie są aktywne jakimś cronem.

Ten pomysł mi się podoba! Dziękuję za pomoc.

Pozostało 580 znaków

2019-09-16 18:24
0

Dodaj do bazy timestamp + jakis czas do tego.
W petli sprawdzaj czy aktualny czas jest wiekszy od tego co w bazie i jak tak to usuwaj.
Ten caly kod daj gdzies na samym poczatku w pliku gdzie masz najwiekszy ruch na stronie. Moze to byc np. index.

nie rób tak proszę, to zła praktyka, index powinien odpowiadać jak najszybciej, nie ma tam czasu na wykonywanie dodatkowych zapytań SQL - Markuz 2019-09-16 21:46

Pozostało 580 znaków

2019-09-18 11:38
1

Ja bym to zrobił jednak w cronie, a nie sprawdzał za każdym razem przy odsłonie strony rekordy do skasowania.

Po drugie samo skasowanie rekordu z bazy nie oznacza, że dane fizycznie zniknęły z pliku, one nadal tam są, zajmują miejsce i spowalniają działanie bazy.

Dopiero proces odśmiecania usuwa takie stare dane i kompaktuje plik do mniejszych rozmiarów, i teraz już nie pamiętam jak było w MySQL, ale zdaje się, że taką operację administrator bazy danych musi przeprowadzić tam ręcznie - albo znowu odpalać automatycznie cyklicznie np. z crona.


edytowany 2x, ostatnio: TomRZ, 2019-09-18 11:40

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0