Dodawanie sekwencyjnych kodów do bazy

0

Witam,

Mam takie zapewne banalne, ale mi niedające spokoju pytanie.

Załóżmy że chce wydawać użytkownikom mojej aplikacji kody które będą sobie odbierać kliknięciem w jakiś przycisk.

Struktura takiego kodu np.taka:

01/01/STY/2022/AABB

Gdzie pierwsza liczba to numer wydanego kodu na dzień, data i jakieś losowe litery. I kolejnego dnia w kodzie data się zwiększa a liczba początkowa znowu leci od jedynki, I to tyle z założeń.

I moje pytanie, jaka jest najbardziej optymalna metoda, aby takie kody do bazy wprowadzać jako „kolejny” kod tego samego dnia

Ja sobie wyobrażam że jest jakaś tabela z wierszami code (string) , userid (int)

I teraz w PHP:

  1. Zapytaniem pobieram ostatni wiersz
  2. Sprawdzam jaką wartość ma komórka code np. 20/01/STY/2022/AABB
  3. Jaką funkcją wyciągam z tego stringa pierwszy człon i zwiększam o 1 czyli 21/01/STY/2022/AABB
  4. Robie insert do tabeli

No i tu teraz mam taką rozkminę, co w sytuacji gdzie powiedzmy teoretycznie aplikacja będzie miała mnóstwo użytkowników którzy będą chcieli odebrać kod.

Czy jest możliwa sytuacja że na poziomie „użytkownika a” który będzie w kroku 2/3 operacji, „użytkownik b” zacznie krok 1 czym samym dla nich obu kod 20/01/STY/2022/AABB będzie ostatnim i w efekcie czego oboje mogą dodać kod 21/01/STY/2022/AABB do bazy?

Czy sytuacja jest niemożliwa? Np. Przez to że kod wykona się na tyle szybko że niemożliwym jest wbić się w te widełki.

Czy sytuacja jest możliwa i najlepiej byłby się przez nią zabezpieczyć np. Sprawdzeniem czy w tabeli nie istnieje kod który chcemy dodać, jak istnieje potwórz całą operację. - i to umieścić po 3 kroku

Czy wql. Cały algorytm dodawania jest bez sensu i należałby to ubrać z innej strony?

2

Zobacz to https://4programmers.net/Forum/Bazy_danych/364716-sekwencyjny_numer_faktury_restartowany_z_nowym_rokiem?p=1879270#id1879270
Jeśli zdecydujesz się na ogranie tego poprzez PHP to nic nie stoi na przeszkodzie żeby na odpowiedniej tabeli dać lock czym możesz zablokować inne działania.

2

@ulq: Nie za bardzo wiem czym się w tej sytuacji martwisz. Po pierwsze, napisałeś, że chcesz "wydawać użytkownikom mojej aplikacji kody które będą sobie odbierać kliknięciem w jakiś przycisk." No i już sprawa załatwiona - użytkownik po kliknięciu w przycisk ma wyświetlony kod i... koniec. Każde kolejne kliknięcie w przycisk generuje kolejny kod.

Jedyne co bym zrobił to zmodernizował bazę. Zamiast trzymać w jednym polu kod dodałbym tam jeszcze TRZY pola, typu numer_dzienny | data | losowe_litery i w ostatni polu code, który trzyma już finalną strukturę. Później łatwiej będzie Tobie tym zarządzać.

Jeżeli obawiasz się, że dwóch użytkowników "kliknie" w tym samym czasie - to nie martw się takimi drobiazgami. Jeżeli mimo wszystko martwisz się - to sposób na to pokazał już Tobie @jurek1980

2

@ulq:

Jak czytam, to nie rozumiem celów, zamiarów.
Masz prawo robić jak chcesz, ale wg mnie jest niepotrzebnie skomplikowane przez rozmycie celów.

Te kody maja być przeznaczone do czytania przez ludzi, czy przetwarzania przez algorytmy?
Zawarta w nich numeracja / miesiąc nie służy ocenianiu ich ważności, chyba ?
A w ogóle to jakaś koncepcja "na czas" czy "na jedno wykorzystanie" ?

1

a może lepiej wygenerować jakiś losowy token i tyle?

0
  1. W bazie normalny Id oraz najlepiej przez bazę trigger/wartość_domyślna/itd. wpisanie daty zapisu.
  2. Ten kod generujesz jako (ilość id<=id_tego rekordu w tej samej dacie)/(data w formacie DD/MMM/YYYY)/(liczba losowa z seed'om Id)
0

Ja bym zrobił osobną tabelkę na takie kody i po prostu dodał kolumny: id, user_id, created_at, additional_code, full_code (po insert uzupelniasz kolumne tak aby ID bylo rownez ID tabeli i po problemie).

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