E 'una buona idea di utilizzare una colonna integer per la memorizzazione degli Stati Uniti Codici di avviamento postale in un database?

StackOverflow https://stackoverflow.com/questions/893454

Domanda

Da un primo sguardo, sembrerebbe Ho due scelte fondamentali per la memorizzazione di Codici di avviamento postale in un tabella del database:

  1. Testo (probabilmente più comune), vale a dire char(5) o varchar(9) per sostenere quattro estensione
  2. Numerico, cioè a 32 bit integer

Entrambi avrebbero soddisfare i requisiti dei dati, se si assume che non ci sono preoccupazioni internazionali. In passato abbiamo generalmente appena andato il percorso di testo, ma mi chiedevo se qualcuno fa il contrario? Proprio da breve confronto sembra che il metodo intero ha due vantaggi evidenti:

  • E ', per mezzo della sua natura, automaticamente limitata a valori numerici solo (mentre senza convalida lo stile del testo potrebbe memorizzare lettere e tale che non sono, a mia conoscenza, sempre valida in un codice postale). Questo non significa che potrebbe / sarebbe / dovrebbe rinunciare a convalidare l'input dell'utente come normale, però!
  • Prende meno spazio, essendo 4 byte (che dovrebbero essere molti anche per 9 cifre CAP) invece di 5 o 9 byte.

Inoltre, sembra che non sarebbe male uscita del display molto. È banale per dargli un ToString() su un valore numerico, utilizzare semplice manipolazione di stringhe per inserire un trattino o spazio o qualunque per l'estensione +4, e usare la formattazione per ripristinare zeri.

C'è qualcosa che scoraggerebbe utilizzando int come un tipo di dati per gli Stati Uniti solo Codici di avviamento postale?

È stato utile?

Soluzione

A CAP numerico è - in un modo piccolo - fuorviante.

I numeri devono significare qualcosa di numerico . Codici di avviamento postale non aggiungono o sottraggono o per partecipare alle operazioni numeriche. 12309 -. 12345 non calcola la distanza dal centro di Schenectady al mio quartiere

Certo, per i codici di avviamento postale, nessuno è confuso. Tuttavia, per gli altri campi di numero simile, può essere fonte di confusione.

Dal Codici di avviamento postale non sono numeri - hanno appena capita di essere codificato con un alfabeto limitato - Suggerisco di evitare un campo numerico. Il risparmio di 1 byte non vale molto. E penso che che significa è più importante che il byte.


Modifica .

"Per quanto riguarda zeri ..." è il mio punto. I numeri non hanno zeri iniziali. La presenza di zeri iniziali significativi su Codici di avviamento postale è l'ennesima prova che non sono numerici.

Altri suggerimenti

Avete intenzione di conservare sempre i codici postali non statunitensi? Il Canada è di 6 personaggi con alcune lettere. Io di solito basta usare un campo di 10 caratteri. Lo spazio su disco è a buon mercato, dover rielaborare il vostro modello di dati non è.

Utilizzare una stringa con la convalida. codici postali può iniziare con 0, quindi numerico non è un tipo adatto. Inoltre, questo vale ordinatamente ai codici postali internazionali (ad esempio nel Regno Unito, che è fino a 8 caratteri). Nel caso improbabile che i codici postali sono un collo di bottiglia, si potrebbe limitare a 10 caratteri, ma controllare il vostro formati di destinazione prima.

Ecco convalida regex per il Regno Unito, Stati Uniti e Canada.


Sì, è possibile pad per ottenere gli zeri iniziali indietro. Tuttavia, si sta buttando via teoricamente informazioni che potrebbero aiutare in caso di errori. Se qualcuno trova 1235 nel database, è che in origine 01235, o è stato perso un'altra cifra?

Best practice dice che si dovrebbe dire quello che vuoi dire. Un codice di avviamento postale è un codice, non un numero. Avete intenzione di aggiungere / sottrarre / moltiplicazione / divisione codici di avviamento postale? E da un punto di vista pratico, è molto più importante che si sta escludendo cerniere estesi.

In genere si usa un tipo di dati non numerico, come un varchar che consentirebbe per più tipi di codice di avviamento postale. Se si è determinata a consentendo solo 5 cifre [XXXXX] o 9 cifre [XXXXX-XXXX] Codici di avviamento postale, è possibile quindi utilizzare un char (5) o char (10), ma io non lo consiglio. Varchar è la scelta più sicura e più sana.

Edit: Si deve anche notare che se non si ha intenzione di fare calcoli numerici sul campo, non si dovrebbe usare un tipo di dati numerici. CAP è un non un numero, nel senso che si aggiungono o tolgono contro di essa. E 'solo una stringa che sembra essere fatta in genere di numeri, così si dovrebbe evitare di utilizzare i tipi di dati numerici per esso.

Dal punto di vista tecnico, alcuni punti sollevati qui sono abbastanza banale. Io lavoro con la pulizia dei dati indirizzo su un tutti i giorni base - in particolare i dati di indirizzo pulizia di tutto il mondo. Non è un compito banale da qualsiasi sforzo di immaginazione. Quando si tratta di zip codici, è potrebbero di memorizzarli come intero anche se può non essere "semanticamente" corretto. Il fatto è, i dati sono di una forma numerica o meno, in senso stretto è numerico considerata in valore.

Tuttavia, la reale inconveniente di loro memorizzazione come tipi numerici è che si perde la capacità di vedere facilmente se i dati sono stati inseriti correttamente (cioè ha valori mancanti) oppure se il sistema rimosso zeri che portano a costose operazioni di convalidare codici di avviamento postale potenzialmente non validi che erano altrimenti corretta.

E 'anche molto difficile da forzare l'utente di input dati corretti se uno dei ripercussioni è un ritardo di business. Gli utenti spesso non hanno la pazienza di immettere dati corretti se non è immediatamente evidente. Usando un'espressione regolare è un modo di garantire dati corretti, se l'utente immette un valore che non è conforme e che stanno visualizzato un errore, possono solo omettono questo valore del tutto o entrano in qualcosa che sia conforme ma è comunque corretto. Un esempio [utilizzando i codici postali canadesi] è che si vedono spesso A0A 0A0 iscritti che non è valida, ma conforme alla regex per i codici postali canadesi. Più spesso che no, questo viene immesso dagli utenti che sono costretti a fornire un codice postale, ma o non sanno cosa sia o non hanno tutte corrette.

Un suggerimento è quello di validare l'intero della voce come unità verificando la correttezza del codice di avviamento postale è corretto se confrontato con il resto del discorso. Se non è corretta, allora che offrono alternative codici di avviamento postale validi per l'indirizzo sarà più facile per loro di ingresso dati validi. Analogamente, se il codice zip è corretto per l'indirizzo, ma il numero civico non rientra nel dominio del codice postale, quindi offrire numeri civici alternativi per tale CAP / combinazione strada.

A meno che non si dispone di un requisito aziendale per eseguire calcoli matematici sui dati del codice di avviamento postale, non c'è nessun punto nel usando un INT. Sei sopra di ingegneria.

Spero che questo aiuti,

Bill

No, perché

  • Non si può mai fare le funzioni matematiche in codice di avviamento postale
  • potrebbe contenere trattini
  • Potrebbe iniziare con 0
  • valori NULL talvolta interpretati come zero nel caso di tipi scalari come numero intero (ad esempio quando si esportano i dati in qualche modo)
  • CAP, anche se è un numero, è una designazione di un territorio, il che significa che questo è un nome invece di una quantità numerica di nulla

CAP è in realtà uno spazio dei nomi in codice, se ci pensate. , ma anche un trattino e lettere maiuscole Tradizionalmente cifre:

"10022-SHOE"

http://www.saksfifthavenue.com/main/10022-shoe.jsp

Realisticamente, un sacco di applicazioni di business non avrà bisogno di sostenere questo caso limite, anche se è valido.

Integer è bello, ma funziona solo negli Stati Uniti, che è il motivo per cui la maggior parte delle persone non lo fanno. Di solito mi basta usare un varchar (20), o giù di lì. Probabilmente eccessivo per qualsiasi locale.

Se si sceglie di usare un numero intero per gli Stati Uniti Zip, si vorrebbe moltiplicare la parte in vantaggio di 10.000 e aggiungere il +4. La codifica nel database non ha nulla a che fare con la convalida di ingresso. È sempre possibile richiedere l'input sia valido o no, ma l'archiviazione è questione di quanto si pensa le vostre esigenze o l'USPS cambierà. (Suggerimento: le vostre esigenze modifica.)

I imparato di recente che in Ruby una ragione che si vorrebbe evitare questo è perché ci sono alcuni codici di avviamento postale che iniziano con zeri iniziali, che, se conservato come in interi sarà automaticamente convertito in ottale.

la documentazione :

  

È possibile utilizzare un prefisso speciale per scrivere i numeri in decimale, esadecimale, ottale o formati binari. Per i numeri decimali utilizzare un prefisso di 0d, per i numeri esadecimali utilizzano un prefisso 0x, per i numeri ottali utilizzare un prefisso di 0 o 0 ° ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top