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

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ć?

1

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ć.

2

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.

0

Nie możesz zrobić tego koszyka w sesji?

0
axelbest napisał(a):

Nie możesz zrobić tego koszyka w sesji?

Niestety, ale nie robię koszyka ;)

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.

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.

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.

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