sugerowałem tabelkę z 2 polami - wyroznik (differentiator??) typu varchar oraz number (current_namber, last_number) jako int. Jak założysz indeks na oba pola (w kolejności wyróżnik, numer
) to cały odczyt będzie leciał po indeksie.
Teraz dla Twojego AKTUALNEGO :p przypadku do pola wyroznik
wstawiasz 4-znakowy ROK. Jak Ci dojdzie konieczność numeracji miesięcznej to NIC NIE ZMIENIASZ poza podawaniem nie samego roku ale rok (4 znaki) + miesiąc (2 znaki). Jak Ci się zmieni z rok/miesiąc na rok/typ to dalej NIC NIE ZMIENIASZ w logice tylko podajesz rok + typ i t odziała bez żadnych zmian.
Takie jest moje zdanie na ten temat. Co więcej takie coś działa u kilkudziesięciu klientów w PL od 25-30 lat i problemu nie ma. Niektórzy mają dzienny przyrost dokumentów idący w dziesiątki tysięcy (oczywiście z różnymi wyróżnikami).
Rozumiem, ze w invoice
tabelce, bedzie number
. Numer moze drastycznie sie zminic, zeby nie robic kombinacji w przyszlosci to najprosciej wydaje sie zapisac sformatowany numer.
Teraz musze zapisac, gdzies sekwencje (int) i moze rok, nie wiem czy zapis roku tak naprawde bedzie potrzebny. Jezeli cos sie zmieni to sekwencja kolumna moze byc usunieta albo zastopiona przy czym nie trace spojnosci z numerem faktury.
Latniej bylo by na przykladzie. Bo z tabelka sa juz dwie rozne wersje. 1 byla, zeby tylko trzymac jeden wiersz i podbijak sekwencje. Druga, zeby zapisywac wszystkie sekwencje. Czasem sa faktury bez sekwencji.
edit
create table invoice_number
(
id serial primary key,
type varchar(3) not null, -- invoice, receipt itd
last_year integer not null,
last_number integer not null
);
create unique index invoice_number_unique_inx
on payment_advance_repayments (last_year, last_number);
W tabeli jest zapisywany 1 rekord na caly typ faktury, paragonu itd.
W tym samamym momencie dwoch userow moze pobrac last_number, wiec trzeba dodac lock na tej tabelce. I wydaje sie, ze to wszystko?