Sollte eine Datenbank-Tabelle über default-Werte?
Ich hatte eine Diskussion mit einem Entwickler bei der Arbeit am Thema soll eine Tabelle default-Werte verwenden. Gibt es eine harte und schnelle Regel auf diese oder ist es eine Grauzone, in best practices?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Regel: wenn viele Datensätze verwenden, die standardmäßig (zumindest anfangs) dann verwende ich gerne als Standard. Zum Beispiel, ein Bild der Tabelle für die Produkte in einem online-Shop könnte ein Standard-Pfad von
images/NoPictureYet.png
. Schließlich, diese ersetzt zu bekommen, aber für Chargen von Daten, bei denen die Bilder einfach noch nicht existieren (und vielleicht die meisten von Ihnen nie werden!), ein Standard macht Sinn (für mich zumindest).Wenn es keine sinnvollen Voreinstellungen (z.B. "Vorname" in einer Kunden-Datenbank - ich möchte nicht, dass MEIN name ausgefallen "FirstName"), dann mache ich es nicht-null-Werte zulässt und kein Standardwert - es ist die Anwendung dafür verantwortlich, dass ein korrekter Wert eingegeben wird.
Aber nicht hart und schnell Regeln auf dieser. Alles schwankt ein wenig 😉
Einen praktischen Fall, wo ich persönlich fand gute Verwendung von default-Werten ist für eine
last_modified
Spalte.Diese Spalte nicht aktualisiert, die von gespeicherten Prozeduren oder business-Logik, wird aber automatisch aktualisiert wird ausgelöst, wenn ein Wert in der Zeile ändert. Es ist jedoch auch
GETDATE()
standardmäßig so, dass der Wert für eine neue Zeile enthält den Zeitstempel Wann es erstellt wurde, das ist im Grunde Wann es zuletzt geändert wurde.Den update-trigger würde dann etwas Aussehen wie dieses:
created_date
undmodified_date
Spalten.modified_date
getan werden muss, als einen trigger on update, und wie ich den code fürcreated_date
im Einklang mitmodified_date
. 😉 Vielleicht nicht der BESTE Grund, aber... tja!Keine harte und schnelle Regel angewendet werden kann. Es kommt auf die Spalten. Es kann ganz sinnvoll, eine Standard-Auftragsart, zum Beispiel, aber die Idee, einen Standard für eine Kunden-Telefonnummer nicht sinnvoll.
Ich würde sagen es ist eine Grauzone. Normalerweise würde ich nicht entwerfen eine neue Datenbank mit vielen Standard-Werte, aber Sie müssen oft verwenden Sie bei der Erweiterung einer bestehenden Anlage.
Beispielsweise das hinzufügen einer neuen nicht-null-Spalte zu einer vorhandenen Datenbank. Sie vielleicht nicht wollen (oder können), aktualisieren Sie den code, fügt in die Tabelle, so würden Sie brauchen, um einen Standard auf, sicherzustellen, dass jeder "legacy" - code noch einfügen von Daten (bei Standard-Wert eignet sich für den legacy-code natürlich).
Default-Werte sind wichtig, wenn die Spalte muss einen Wert (nicht null). In der Tat, wenn Sie ändern eine Spalte aus so dass null-Werte nicht erlaubt Ihnen, einen default-Wert ist ziemlich notwendig, da nicht alle vorhandenen code können füllen Sie einen Wert ein. Manchmal in diesem Fall wird der default-Wert ist so etwas wie 'UNBEKANNT'. Dies gilt insbesondere, wenn Sie verwenden möchten, die MIT WERTEN um die default Werte zu vorhandenen Datensätze wo das Feld null ist in der ALTER TABLE-Anweisung ändert die Spalte NICHT NULL
Default-Werte sind entscheidend für die Felder, die der Benutzer-Schnittstelle in der Regel nicht deal mit. Zum Beispiel haben wir den default-Werten auf date_inserted und user_inserted Spalten, die der Benutzer nie selbst kennt, gibt es. Besonders kritisch ist dies, wenn viele unterschiedliche Anwendungen können füllen Sie die Daten, um sicherzustellen, dass keine vergisst man über diese Spalten.
Dann gibt es Spalten, die in der Regel Wert auf die Eingabe von Daten, die möglicherweise zu einem späteren Zeitpunkt ändern. Dinge wie eine status-Spalte.
Viele Spalten kann nicht wirklich ein Standard, wenn. Was wäre die default-Adresse oder den Namen eines Benutzers?
tl;dr: die Default-Werte sind die business-Logik, und ich möchte, dass business-Logik in das Objekt-Modell. Als solche kann eine Datenbank nicht enthalten default-Werte.
E. g. In der Datenbank habe ich ein bit-Feld: IsANicePerson. Dieses Feld führt zu einer Eigenschaft der Person-Klasse. Optimistisch von Natur, ich will der Standardwert für diese Eigenschaft 'true' ist. So in der Person-Klasse implementiere ich diese (als Standardwert für die isANicePerson Feld sichern). Wenn würde ich den default-Werten in der Datenbank müsste ich duplizieren diese Logik. Doppelten code/Logik schlecht ist. Daher mein Einwand auf default-Werte.
Disclaimer: ich Lebe in einer OO-Welt und verwenden Linq2Sql.
Sollte es sehr einfach sein. Wenn die Daten sollten in der Regel einzigartig für jede Zeile wie die Kunden Telefonnummer oder der default-Wert wird wahrscheinlich im Laufe der Zeit ändern, dann würde ich es nicht verwenden. Das heißt, es ist wirklich nur nützlich für Füllung CreateDate, ModifiedDate oder andere Spalten, die Natur.
Hier sind die Richtlinien, die ich persönlich benutze in Bezug auf Standard-Werte, die haben mir gut gedient in der Vergangenheit. In den folgenden Beispielen betrachten wir ein Datenbank-backend mit mehreren Anwendungen mit lese - /schreib-Zugriff auf das backend. In diesen Fällen ist es wichtig, dass die Datenbank definieren, wie die Daten modelliert werden und damit die Datenintegrität sicherzustellen.
1) CreatedDate und ModifiedDate Spalten. Diese Spalten sich in der Regel getdate () - (sql-server) als Standard festgelegt. Wie bereits in anderen Beiträgen werden diese Felder können dann aktualisiert werden, mit Trigger usw.
2) Boolean Zustand Spalten. Beispiele: "IsDefault", "IsDeleted" (für die überwachung), "IsActive",etc. Alle diese Felder haben in der Regel eine logische Standardstatus, dem sollte definiert werden, durch das Daten-Modell. Ausnahmen wäre natürlich null-Werte zulässt tri-state-boolean-Felder, in denen die null-Status darstellt, etwas über die Daten im Datensatz gespeichert.
3) Daten, die constraint-Definitionen: Spalten mit AllowNull=false und kein Standardwert definiert. In anderen Worten, einen Wert für die Anwendung erforderlich sind.
4) - Lookup-Tabelle, foreign key-Identitäten: Dies ist wahrscheinlich nicht der norm, aber für eine Menge der lookup-Tabelle Fremdschlüssel definiere ich ein Standard, der für den anfänglichen Zustand eines Datensatzes. So zum Beispiel in einer "Ereignis" - Tabelle die Fremdschlüssel-Spalte "EventTypeId"(int autoincrement) haben Standard-1 und stellen die "Allgemeine" oder so etwas. Dies deckt die meisten Szenarien, in denen, zum Beispiel, ich möchte ein Ereignis protokollieren, aber dont care über einen bestimmten Typ id.
5) Nicht-kritische string-Spalten "Beschreibung", "Comment" etc. Für diese Spalten werde ich allgemein definieren " als Standard rein zu simpify System.DbNull=>Null-conversion-handling-Anwendungen. Dies ist etwas, das kann nicht sein anwendbar in allen Szenarien vor allem, wenn die betroffene Tabelle enthält Millionen von Zeilen und Stauraum ist ein Problem.
Also zusammenfassend gesagt, verwendet die Standardwerte, um sicherzustellen, die Integrität der Daten von den tatsächlichen Daten in der Datenbank gespeichert. Das Datenmodell sollte festgelegt werden, wie diese Daten Integrität Regeln in sich und jede Anwendung die Interaktion mit es wird und sollte gezwungen werden, sich zur Beachtung dieser Regeln. Bitte beachten Sie auch, dass dies nicht die Lehre ist, und dass es immer Ausnahmen. Betrachten Sie jedes Szenario individuell, so dass es sinnvoll für Ihre Datenbank/Anwendung.
Definitiv eine Grauzone. Es ist das klassische, wie viel business-Logik in die Datenbank in Frage.
Wenn wir wollten die Puristen und sagen, keine business-Logik gehört in die Datenbank, dann wäre die Antwort nie verwenden.
Praktischen können wir eine Ausnahme machen, wie wir das oft tun und lassen, die Logik der Standardwert in der Datenbank.