Domanda

ho avuto una discussione con uno sviluppatore al lavoro sulla questione del se un uso tabella i valori di default. C'è una regola ferrea su questo o è una zona grigia in migliori pratiche?

È stato utile?

Soluzione

La mia regola: se molti record useranno che di default (almeno inizialmente) poi mi piace usarlo come predefinito. Ad esempio, una tabella di immagine per i prodotti in un negozio online potrebbe avere un percorso predefinito di images/NoPictureYet.png. Alla fine, chi otterrà sostituito, ma per i carichi di batch di dati in cui semplicemente non esistono ancora le immagini (e forse la maggior parte di loro non lo farà mai!), Un default ha un senso (per me, almeno).

Se non v'è alcun valore predefinito sensibile (come "nome" in un database di clienti - Non voglio il mio nome in default a "Nome"), allora lo faccio non annullabile e nessun difetto - è responsabilità dell'applicazione al fine di garantire che un valore corretto viene inserito.

Ma nessun regole dure e veloci su questo. Tutto varia un po ';)

Altri suggerimenti

Un caso pratico in cui personalmente ho trovato un buon uso di valori di default è per una colonna last_modified.

Questa colonna viene mai aggiornato da stored procedure o la logica di business, ma viene aggiornata automaticamente dal trigger quando qualsiasi valore nei cambiamenti di fila. Tuttavia è anche impostato GETDATE() predefinita in modo che il valore di una nuova riga dovrebbe contenere il timestamp di quando è stato creato, che è fondamentalmente quando dell'ultima modifica.

ALTER TABLE users ADD CONSTRAINT dc_users_last_modified
                  DEFAULT GETDATE()
                  FOR last_modified;

Il trigger di aggiornamento sarebbe quindi simile a qualcosa di simile:

CREATE TRIGGER trigUpdate_users 
ON users 
FOR UPDATE 
AS 
BEGIN 
    IF NOT UPDATE(last_modified) 
        UPDATE users SET last_modified = GETDATE() 
        WHERE user_id IN (SELECT user_id FROM inserted);
END 
GO

No regola ferrea può essere applicata. Dipende colonne. Può essere totalmente ragionevole per avere un tipo di ordine predefinito, ad esempio, ma l'idea di un default di un numero di telefono del cliente non ha senso.

Direi che è una zona grigia. In genere non mi progettare un nuovo database con un sacco di valori di default, ma è spesso la necessità di usarli quando migliorare un sistema esistente.

Ad esempio l'aggiunta di una nuova colonna non nullo a un database esistente. Potrebbe non vuole (o essere in grado di) aggiornare tutto il codice che inserisce in quel tavolo, in modo che avrebbe bisogno di mettere un default su di esso per garantire che qualsiasi codice "legacy" può ancora inserire i dati (assumendo il valore predefinito è appropriato per il codice legacy ovviamente).

valori predefiniti sono importanti se la colonna deve avere un valore (non è nullo). In realtà, se si sta modificando una colonna dalla permettendo null a non permettendo loro un valore di default è più o meno necessaria in quanto non tutto il codice esistente può compilare un valore. A volte, in questo caso il valore predefinito è qualcosa di simile a 'Unknown'. Ciò è particolarmente vero se si desidera utilizzare i valori con quello di fornire i valori di default per i record exisiting in cui il campo è nullo nella dichiarazione ALTER TABLE che cambia la colonna NOT NULL

I valori di default sono critici per i campi che l'interfaccia utente in genere non tratta. Per esempio abbiamo i valori di default su colonne date_inserted e user_inserted che l'utente non sa nemmeno ci sono. Ciò è particolarmente importante se diverse applicazioni potrebbero popolare i dati per garantire che nessuno dimentica queste colonne.

Poi ci sono le colonne che sono in genere dato un valore su di inserimento dati che possono cambiare in seguito. Cose come una colonna di stato.

Molte le colonne non si può davvero avere un default però. Quale sarebbe l'indirizzo predefinito o il nome di un utente?

tl; dr: I valori di default sono la logica di business, e voglio logica di business nel modello a oggetti. In quanto tale, un database non può contenere valori di default.

es. Nel database ho un campo di bit: IsANicePerson. Questo campo si traduce in una proprietà sulla classe Persona. Essendo ottimista per natura, voglio che il valore predefinito per questa proprietà di essere 'vero'. Così nella classe Person a implementare questo (come il valore di default del campo supporto isANicePerson). Se mi permetterei valori di default nel database avrei dovuto duplicare questa logica. Duplicate il codice / logica è male. Di qui la mia obiezione a valori di default.

. Disclaimer: Io vivo in un OO-mondo e uso Linq2Sql

Dovrebbe essere abbastanza semplice. Se i dati di solito dovrebbe essere unico per ogni riga, come il numero di telefono del cliente o il valore di default è molto probabile che il cambiamento nel corso del tempo, allora io non lo uso. Ciò significa che è utile solo per il riempimento CreateDate, ModifiedDate, o altre colonne di questa natura.

Qui ci sono le linee guida che personalmente uso per quanto riguarda i valori di default che mi hanno servito bene in passato. Negli esempi che seguono, si consideri un back-end database con più applicazioni con accesso in lettura / scrittura al backend. In questi casi è indispensabile che il database definiscono come i dati devono essere modellata e quindi garantire l'integrità dei dati.

1) CreatedDate e ModifiedDate colonne. Queste colonne tipicamente avranno getdate () (server SQL) definito come predefinito. Come già detto in altri post, questi campi possono essere aggiornati con i trigger, ecc.

2) colonne stato booleano. Esempi: "IsDefault", "IsDeleted" (per il controllo), "IsActive", ecc. Tutti questi campi in genere hanno uno stato predefinito logica che dovrebbe essere definito dal modello di dati. Le eccezioni a questa sarebbe ovviamente nullable tre stati campi booleani, in cui lo stato nullo rappresenta qualcosa sui dati memorizzati nel record.

3) le definizioni dei vincoli dati: Colonne con AllowNull = false e non definito di default. In altre parole, un valore non è richiesto dall'applicazione.

4) tabella di ricerca identità chiave esterna: Questo probabilmente non è la norma, ma per un sacco di tabella di ricerca chiavi esterne che definirà un default che copre lo stato iniziale di un record. Così, per esempio, in una tabella di "Evento" la colonna chiave esterna "EventTypeId" (int-autoincrement) avrà di default 1 e rappresentano "Generale" o qualcosa del genere. Questo riguarderà la maggior parte degli scenari in cui, per esempio, voglio registrare un evento, ma non si preoccupano per un tipo specifico id.

5) non critici colonne di stringhe: "Descrizione", "Commento" ecc Per queste colonne io generalmente definire '' come predefinito puramente a simpify System.DBNull => Null conversione movimentazione nelle applicazioni. Questo è qualcosa che potrebbe non essere applicabile in tutti gli scenari in particolare quando la tabella in questione contiene milioni di righe e spazio di archiviazione è un problema.

Quindi, in sintesi, utilizzare le impostazioni predefinite per garantire l'integrità dei dati dei dati effettivi memorizzati nel database. Il modello di dati dovrebbe definire queste regole di integrità dei dati in sé e qualsiasi applicazione interagire con esso sarà e dovrebbe essere costretto a rispettare tali norme. Inoltre si ricorda che questa non è la dottrina e che ci saranno sempre delle eccezioni. Prendere in considerazione ogni scenario individualmente in modo che abbia senso per il database / applicazione.

Sicuramente una zona grigia. È la logica classica quanto commercio di mettere la questione del database.

Se volessimo essere purista e dire no logica di business appartiene nel database, allora la risposta sarebbe mai usarli.

Essendo pratico possiamo fare un'eccezione, come facciamo spesso e consentire la logica di un default nel database.

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