Was ist die beste Methode zum Speichern von Standardwerten in der Datenbank?

8

Ich habe mehrere Tabellen wie Buyers , Shops , Brands , Money_Collectors , e.t.c.

Jeder von diesen hat einen Standardwert, z.B. Der Standardwert Buyer ist David , der Standardwert Shop ist Ebay usw.

Ich möchte diese Standardwerte in einer Datenbank speichern (damit der Benutzer sie ändern kann).

Ich dachte, is_default -Spalte zu jeder der Tabellen hinzuzufügen, aber es scheint ineffektiv zu sein, weil nur eine Zeile in jeder Tabelle der Standard sein kann.

Dann dachte ich, dass das Beste wäre, Defaults table zu haben, das alle Standardwerte enthält. Diese Tabelle enthält 1 Zeile und N Spalten, wobei N die Anzahl der Standardwerte ist:

%Vor%

Dies scheint jedoch nicht der beste Ansatz zu sein, da sich die Tabellenstruktur ändert, wenn ein neuer Standardwert hinzugefügt wird.

Was wäre der beste Ansatz zum Speichern von Standardwerten?

    
Misha Moroshko 12.01.2011, 11:14
quelle

5 Antworten

18

Nur um klar zu sein.

Der beste Weg ist mit einer Spalte auf jeder Tabelle, aus der Dropdown-Quellen stammen.

Und hier ist warum ...

  

"Sollte ich mich nicht um den Raum kümmern, wenn   Daten in einer Datenbank speichern? "

Die kurze Antwort ist nein. Die längere Antwort ist, worüber Sie sich Sorgen machen sollten, ist die Leistung. Wenn du dich auf den Weltraum konzentrierst, wirst du sehr schlechte Dinge tun.

Schlechte Dinge, die Sie tun, wenn Platz ein Problem ist.

  • Sie werden Bedeutung in Primärschlüssel vergraben. d.h. Smart Keys.
  • Sie werden versuchen, mehrere Werte in einer Spalte zu speichern.
  • Sie indexieren zu wenig
  • (Zweifellos könnten wir eine Liste von 50 schlechten Praktiken erstellen, die Platz sparen)
  

Angenommen, es gibt 50 Geschäfte (Auswahlfeld)   mit 50 möglichen Werten). In diesem   Fall, um den Standard-Shop zu speichern   brauche 50 boolesche Felder,

Nun, es ist ONE Boolesche Spalte. Es existiert in jeder Zeile.

Lass mich dich das fragen. Wenn Sie eine Tabelle mit einer Datumsspalte erstellt und eine Zeile eingefügt haben, wie viel Speicherplatz würden Sie auf der Festplatte verwenden?

Wenn Sie eine 7 oder 8 Bytes sagten, dann sind Sie etwa 1000 mal aus.

Die kleinste Speicherplatzeinheit ist ein Block. Blöcke sind typisch 8kb (die können so klein wie 2kb so groß wie 32kb sein, im Allgemeinen (keine Nitpicking hier, die tatsächlichen Grenzen sind unwichtig))

Nehmen wir an, Sie haben 8kb Blöcke, dann Ihre 1 Spalte, 1 Zeile Tabelle dauert 8Kb. Wenn Sie weitere 999 Zeilen einfügen, werden immer noch 8 KB benötigt. (Auch hier gibt es keinen Aufwand pro Block und pro Zeile - es ist ein Beispiel)

In Ihrer Nachschlagetabelle mit 50 Speichernamen ist die Wahrscheinlichkeit, dass Sie die Größe der Tabelle um 50 Byte erhöhen müssen, also von 1 auf 2 erhöht, also gering und völlig irrelevant.

Auf der anderen Seite wird Ihre Standardtabelle sicherlich mindestens einen zusätzlichen Block einnehmen. Am schlimmsten ist es jedoch für PERFORMANCE , dass Ihr Aufruf zum Füllen eines Dropdown-Menüs zwei Hin- und Rückfahrten zur Datenbank erfordert, einen zum Abrufen der Liste, einen zum Abrufen der Standardeinstellung. (Ja, vielleicht kannst du das in einem machen, aber geh damit)

Sie haben also genau null Speicherplatz gespeichert und Ihren Netzwerkverkehr verdoppelt.

Sie sehen, was ich sage.

Ein weiterer entscheidender Grund, sich keine Sorgen mehr um den Weltraum zu machen, ist, dass Sie die Klarheit aufgeben. Denken Sie an den Entwickler, den Sie einstellen werden, um diese App zu betreiben. Wenn er dem Team beitritt und sich die Datenbank ansieht, stellen Sie sich die beiden Szenarien vor.

  1. Es gibt eine boolesche Spalte namens Default_value
  2. Es gibt eine Tabelle mit keinen Beziehungen zu irgendetwas, das als Default_Values ​​
  3. bezeichnet wird

Sie bitten ihn, ein neues mit einem Dropdown für "Geschäft" zu erstellen.

In Szenario 1 findet er die Speichertabelle, verdrahtet das Dropdown auf eine einfache Abfrage der Tabelle und verwendet das Feld default_value, um den Anfangswert auszuwählen.

Wie würde er in Szenario 2 ohne ein Training wissen, nach einer separaten Tabelle zu suchen? Vielleicht würde er den Tisch sehen, aber zu der Zeit, die Sie einstellen, hat Ihr Datamodell jetzt Hunderte von Tabellen.

Noch ein wenig erfunden, aber der Punkt ist hervorstechend. Klarheit in der Datenbank ist gut, lohnt sich ein Byte pro Zeile.

Technisches Zeug

Ich bin kein MySQL-Typ, aber in Oracle nimmt eine Null-Spalte am Ende einer Zeile keinen zusätzlichen Platz ein. In Oracle würde ich ein Varchar2 (1) verwenden und "T" = Default lassen und die anderen null lassen. Dies hätte den Effekt, dass nur 1 Additionsbytesumme und nicht pro Zeile verwendet wird. YMMV mit MySQL, können Sie diese Frage separat stellen, wenn Sie die Antwort nicht googlen können.

Aber die Zeit, sich darum zu sorgen, ist Millionen von Zeilen, nicht Hunderte. Jede Tabelle, die ein Dropdown-Menü eingibt, wird niemals groß genug sein, um sich Sorgen um zusätzliche Bytes zu machen.

    
Stephanie Page 19.01.2011, 14:59
quelle
1

Was ist, wenn Sie ein XML erstellen und dieses XML dann in der Tabelle in einer XML-Spalte speichern? Die XML-Spalte würde das XML enthalten, und das XML könnte Tags von Tabellen und einen Unterknoten von Standardwerten haben.

    
Naveed Butt 17.01.2011 10:57
quelle
0

Sie sollten stattdessen eine Tabelle mit zwei Spalten und n Zeilen erstellen

%Vor%

Auf diese Weise können Sie neue Werte hinzufügen, ohne die Tabellenstruktur zu ändern

    
Mchl 12.01.2011 11:20
quelle
0

Sie können eine Katalogtabelle (eine Art Metadatentabelle ) erstellen, die die Standardwerte als Zeichenfolgen für die gewünschten Tabellenspalten enthält. Dann können Sie die Funktion convert verwenden, um den entsprechenden Wert zu erhalten. Im Folgenden finden Sie eine Beispieltabellendefinition ( Transact-SQL wurde verwendet):

%Vor%     
ArBR 21.01.2011 19:14
quelle
0

Was Sie speichern möchten, sind keine Metadateninformationen. Zuallererst, also werde ich keinen externen Datenspeicher erfinden, um diese Daten zu speichern. (Zusammen mit extra Code)

Ich nehme an, Sie haben eine PK-Sequenzgenerierungslogik (unter Ihrer Kontrolle). Ich werde eine magische Zahl x zuweisen und ich werde einen Datensatz in jede Tabelle mit _id = x als Standardwert einfügen. Wenn Sie also dem Benutzer den Standardwert anzeigen möchten, können Sie in Ihrer Abfrage einheitlich umgehen, oder Sie können dies in der Anwendungslogik beim Einfügen behandeln. Das Gute daran ist, dass Sie jederzeit auf den Standardwert zugreifen können, ohne zusätzliche Logik zu schreiben, und die Logik zum Beibehalten des Standardwerts einer Tabelle kann mit demselben Code gepflegt werden (Templating;) (Aus den Lektionen, die W3c aus der Modellierung von XML-Schemainformationen mit DTD gelernt hat.)

Nur zu beachten ist, dass diese Logik explizit gemacht werden sollte, indem entweder eine umfangreiche Dokumentation verwendet wird oder die Verwendung eines Triggers dies schwierig macht.

    
uncaught_exceptions 24.01.2011 03:29
quelle