Come progettare un buon numero di ricevuta [chiuso]

4

Sto sviluppando un'applicazione web, questa applicazione dovrà generare un numero di ricevuta per ogni transazione confermata.

Che cos'è un buon numero di ricevuta? Penso che un numero di ricevuta non dovrebbe essere solo un numero progressivo generato dal database, ma dovrebbe avere un significato al di là di un numero di esecuzione unico.

Ecco ciò che ho inventato finora

Format: EYY-ddd-XXXXXXX
Example output: E13-146-0000001

Dove:

E : è solo un segno per indicare che questo numero di ricevuta è stato generato dal mio sistema. Questo valore è sempre E .

YY : è l'anno corrente in cui è stato generato lo scontrino, quindi in questo caso è 13

ddd : è il giorno dell'anno, 146 è il 26 maggio (nel 2013).

XXXXXXX : è un numero progressivo di 7 cifre, fino a 9.999.999

Quindi il mio sistema può generare fino a 10 milioni di numeri di ricevute univoci ogni giorno fino al 2099.

Che ne pensi? È sensato? Qualsiasi suggerimento è apprezzato.

Aggiorna

A giudicare dai commenti fino ad ora, sembra che non ci siano specifici "pattern" o "best practice" per il numero di ricevuta. La mia intenzione nel porre la domanda è sapere se ci sono specifiche migliori pratiche nel generare il numero che dovrei sapere. Sembra che io sia libero di usare qualsiasi modello che ritenga sensato.

Altri requisiti

  • Il più breve possibile (ecco perché non ho scelto YYYYMMdd-XXXXXXX)
  • In qualche modo non ovvio (YYYMMdd è ovvio)
  • Dovrebbe essere una lunghezza fissa. (È più facile rilevare se il cliente ha inserito un numero di ricevuta non valido)
  • Può generare numeri abbastanza grandi (10 milioni al giorno sembra ragionevole, anche se dubito che il mio sistema sarà così popolare)
  • Può essere trasformato in codice QR (in modo che il personale possa eseguire la scansione e verificare che il numero sia valido)
  • Qualcuno parla del codice di rilevamento degli errori come l'ISBN , sembra buono ma non l'ho ancora letto.
posta Random Alphabets 25.05.2013 - 20:00
fonte

4 risposte

8

A meno che la codifica delle informazioni aggiuntive non sia utile per scopi che non hai descritto nella tua domanda, non tentare di creare alcun tipo di intelligenza nei tuoi numeri. Alla fine si ritorcerà contro, spesso in un modo che renderà il recupero difficile e costoso.

Il mio consiglio? Usa un numero intero di sequenza e fallo con esso. Sono facili da gestire e, se li si utilizza come identificativi in un database, vengono archiviati in modo compatto e indicizzati molto più rapidamente rispetto alle stringhe.

As short as possible

Se in realtà stai facendo solo 10.000 transazioni al giorno, avrai tre zeri inutili in ogni numero di scontrino praticamente per sempre. Questo rende i tuoi numeri il 30% più grandi di quanto debbano essere. Più cifre aumentano le probabilità che ci sia una comunicazione o un errore di battitura. Qualcuno che non ha familiarità con il tuo schema non saprà che ci dovrebbero essere sette cifre nel tuo numero di sequenza e dovrà contare una serie di zeri iniziali per le ricevute con numero basso - ne avrai un sacco di quelle quotidianamente - e questo consumerà più tempo di quello che salverà.

Un numero intero di sequenza non durerà più finché non esaurisce le cifre nella sua dimensione attuale e può crescere praticamente all'infinito. I giorni in cui si esegue un volume basso ritarderanno l'aggiunta di cifre.

Somewhat not to obvious (YYYMMdd is way to obvious).

Non pensare per un minuto che qualcuno che vuole fare qualcosa di nefasto con i numeri di ricevuta non guarderà il suo calendario e noterà che stai usando l'anno e il giorno di Julian. Se il numero di ricevuta è l'unico metodo per verificare che qualcuno che te lo consegna sia il cliente che lo ha ricevuto, ti verrà compromesso. Gli amatori modellano i sistemi, i professionisti incastrano le persone.

Should be fixed length. (Easier to detect if customer entered invalid receipt number)

Non è davvero più semplice; se il numero non è nel tuo database, non è valido. C'è un sacco di potenziale per qualcuno di inserire un numero non valido che è la lunghezza giusta.

Can generate fairly large numbers (10 million a day seems sensible, though I doubt my system will be that popular)

Un numero intero senza segno a 64 bit può contenere un valore massimo di 9.223.372.036.854.775.807. Questo ti darà un miliardo di numeri unici al giorno per i prossimi 2,5 milioni di anni, più a lungo se non stai facendo questo tipo di volume.

Can be made into QR code (so staff can scan and verify the number is valid)

L'uso delle cifre assicura che sarai in grado di utilizzare qualsiasi formato di codice a barre. I codici a barre lineari eseguono una scansione molto più veloce di QR e sono leggibili in condizioni molto peggiori. Questo dovrebbe essere preso in considerazione se c'è un magazzino coinvolto.

    
risposta data 26.05.2013 - 15:15
fonte
2

Senza ulteriori informazioni sembra ragionevole, se non eccessivamente complesso. Nessuno qui può dire per certo che soddisferà i tuoi bisogni, poiché non hai detto quello che sono.

Cosa c'è di sbagliato con un numero sequenziale a partire da 0? - Dichiari "pensi che non sia abbastanza buono", quale requisito non soddisfa ?.

Cosa succede dopo il 2099 - qual è il requisito, cosa succede dopo 9.999.999 transazioni in un giorno - qual è il requisito, 'E' - quale requisito soddisfa?

    
risposta data 26.05.2013 - 03:22
fonte
2

Vorrei aggiungere una cifra di checksum. Rende più facile capire se qualcuno lo scrive e commette un errore.

    
risposta data 26.05.2013 - 04:05
fonte
1

Molti sistemi genereranno questi numeri contemporaneamente? Se è così, allora né il tuo sistema né i numeri sequenziali saranno sufficienti; ci saranno giorni in cui Internet non funziona, o un bug da qualche parte provoca collisioni e così via. Se queste cose sono vere, utilizzerei un GUID (che è "abbastanza unico"). Se i GUID non sono un'opzione, passerei all'esagono e userei una stringa numerica semantica come questa:

EDDDDLLLLNNNNNNNNC

Dove E è il tuo flag generico "Ho fatto questo", D è una stringa esadecimale che rappresenta l'anno e la data in esadecimale, L è una stringa esadecimale che rappresenta la posizione di origine (che consente 65.000 sistemi POS separati o altre fonti per utilizzare il sistema senza collisione), N è un numero di sequenza semplice per tale origine e C è una cifra di controllo.

Un esempio:

E3FDF00A2000000D2C

3FDF rappresenta 16351 , o il 12 giugno 2051. 00A2 rappresenta il tuo sistema POS. Il 000000D2 rappresenta il numero di sequenza del giorno e C è una cifra di controllo (calcolata semplicemente come (3FDF + A2 + D2) % F , che potrebbe non essere algoritmicamente perfetta).

Se sei disposto a rilassare il requisito che sia sempre della stessa lunghezza, puoi facilmente renderlo elastico, in modo che quanto sopra sia visualizzato come:

E3FDF00A2D2C

Le prime 9 cifre sono sempre le stesse e l'ultima cifra è la cifra di controllo, quindi il resto è il numero di sequenza. Se sei aperto ad avere un personaggio divisorio, potresti renderlo ancora più breve:

E3FDFA2-D2C
    
risposta data 26.05.2013 - 17:12
fonte

Leggi altre domande sui tag