Validazione di entità e modello e vincolo DB

4

Quando si tratta di prestazioni: Qual è il modo migliore per convalidare l'input dell'utente?

Se pensi a un numero di telefono e vuoi solo numeri nel database, ma potrebbe iniziare con uno 0, quindi utilizzerai varchar:

È meglio controllarlo tramite il modello di entità come questo:

 @Size(min = 10, max = 12)
 @Digits(fraction = 0, integer = 12)
 @Column(name = "phone_number")
 private String phoneNumber;

O è meglio usare sul lato del database un CHECK (e nessun controllo nel modello dell'entità) per la stessa funzione?

    
posta Joerg 28.06.2012 - 18:32
fonte

4 risposte

4

Le prestazioni sono irrilevanti per la convalida dell'input dell'utente.

Se impiega troppo tempo per convalidare il modulo, il tuo modulo contiene troppi campi. Dovrebbero essere in numero di migliaia (nella maggior parte dei linguaggi di programmazione) prima che le prestazioni diventassero un fattore limitante.

Dove convalidare dipende da quali sono i tuoi obiettivi. Se il tuo database si connetterà a diversi sistemi, potrebbe avere senso eseguire la convalida direttamente nel sistema di database. Ma il modello di validazione può essere più ricco altrove, come illustra l'esempio nella tua domanda.

Inoltre, se esegui la convalida sul lato client, dovrai ancora convalidare di nuovo sul lato server (non fidarti mai dei dati del cliente).

    
risposta data 28.06.2012 - 18:36
fonte
4

In genere finisci per ripetere alcune convalide:

  • Convalidate il cliente solo per le prestazioni (feedback immediato)
  • La convalida sul server perché non ti fidi del client e la convalida è tecnicamente logica aziendale e non appartiene al livello dati
  • Convalidi nel database (livello dati) se qualcosa diverso da scrive la tua applicazione nel database che non esegue la convalida perfetta stessa

Sfortunatamente questo significa ripetersi, ma questa è la vita quando si tratta di programmare oggi. Tecnicamente, se stai usando Node.js dovresti essere in grado di condividere il codice di convalida tra il client e il server.

    
risposta data 28.06.2012 - 19:24
fonte
2

Se si utilizza un database condiviso da molte applicazioni e tutte le applicazioni condividono le stesse regole, la convalida nel livello del database ha senso. Questo vale anche se il tuo database è popolato da feed come feed di gruppo. In caso contrario, è comune includere convalide che non richiedono dati di database nel client o nel livello aziendale o in entrambi. I vincoli del database vengono sempre utilizzati per Integrità referenziale, imposizione PK e imposizione "non nulla". Considerando la necessità di velocità durante l'immissione dei dati, è difficile giustificare la risposta del database con un errore come per la risposta @chaos.

È meglio se puoi centralizzare l'elaborazione della convalida. Per quanto riguarda l'utilizzo del vincolo di controllo, notare che:

  • Il vincolo di controllo non consente messaggi di errore personalizzati

  • Si applicano solo ai dati in 1 tabella

  • Non si applicano alle viste

risposta data 28.06.2012 - 19:22
fonte
0

Le regole del modello di entità possono essere applicate sia sul lato server sia visualizzate come codice JavaScript da applicare sul lato client, migliorando notevolmente l'esperienza utente. Non c'è competizione.

    
risposta data 28.06.2012 - 18:56
fonte

Leggi altre domande sui tag