2009-07-06 1 views
2

Ich bin mir nicht sicher, ob diese Art von Frage schon einmal gestellt wurde, aber ich suchte und konnte alles finden.Der beste Weg, um viele boolesche Spalten in der Tabelle zu speichern

Ich arbeite an einer Datenbank im Moment, die Datensätze hat, die mit ihnen eine Menge boolean basierend Werte gespeichert sind, so dass die Tabellenstruktur sieht ungefähr so ​​aus:

===Table=== 
ID <- int 
Name <- string 
Bool1 <- bool 
Bool2 <- bool 
Bool3 <- bool 
Bool4 <- bool 
Bool5 <- bool 
Bool6 <- bool 
Bool7 <- bool 
Bool8 <- bool 
Bool9 <- bool 

nicht alle Boolesche Werte gesetzt ein einmal, so kann jeder Datensatz eine, viele oder keine ausgewählt haben.

Ich habe darüber nachgedacht, so etwas wie dies zu tun: zwischen der Haupttabelle und zweiten Tabelle verknüpft auf ValueID

==Main Table==  ===Second Table==== 
ID <- int PK   ValueID <- PK links to Main Table ValueID 
Name <- string  ID <- int 
ValueID <- FK   Value <- Contains name of assigned value eg Bool1, Bool2 

So gibt eine Eins-zu-Beziehung ist. Die zweite Tabelle enthält also nur die Daten für die ausgewählten Elemente und stattdessen einen Haufen leerer boolescher Werte in der Haupttabelle.

Der Grund, warum ich darüber nachdachte, war, dass es mir erlauben würde, andere Werte hinzuzufügen, die in Zukunft gegen den Datensatz gespeichert werden, anstatt die Tabellenstruktur zu ändern.

Wäre dies ein guter Weg, um die vielen booleschen Werte zu speichern?

Ich würde wirklich gerne in der Lage sein, dies an ein Formular mit Kontrollkästchen zu binden, würde es so schwer machen.

Also wenn das ein bisschen schwer zu verstehen ist, was ich brauche, weiß ich nicht wirklich, wie man es im Text erklärt.

Danke.

Antwort

-1

Nur eine Idee, Sie können int verwenden, um Bits zu speichern, bitweises Arbeiten sind effizient, aber ich bin mir nicht sicher, wie gut SQL sie unterstützt. In C# gibt es Bit Enums, so dass Sie den Wert direkt speichern können.

+0

Wäre ein Schmerz zu fragen, amlest. – nos

+0

Ja, ich dachte daran, aber ja Schmerz zu fragen und nicht sehr freundlich. –

+0

Das eigentliche Problem ist, dass Sie die Chance verlieren würden, dass ein Index die Abfragen beschleunigt. –

0

Wenn Sie erwarten, dass sich die Anzahl der booleschen Werte für einen Hauptdatensatz ändert, empfehle ich die Trennung in zwei Tabellen.

Legen Sie nicht die FK (ValueID) in die Haupttabelle, sondern die MainID in die zweite Tabelle.

Einige Dinge, die aus Ihrer Frage nicht klar sind: Wenn ein Wert nicht gesetzt ist, entspricht dies einem falschen Wert oder haben Sie eine ternäre Logik mit Nullwerten? Wenn Letzteres der Fall ist, müssen Sie ein boolesches Feld in Ihre zweite Tabelle einfügen. Andernfalls reicht das Fehlen eines Datensatzes in der zweiten Tabelle aus, um das logische Ergebnis falsch zu geben.

Wenn sich die Anzahl der booleschen Attribute nicht ändert, können Sie sie in ein einzelnes Integer-Feld einfügen und sie maskieren, wie Mike Chaliy vorschlägt.

+0

Ja, wenn der Wert nicht in der zweiten Tabelle gespeichert ist, wird er als falsch angenommen. Ich versuche nur zu vermeiden, einen Haufen leerer boolescher Werte zu speichern. –

14

Lassen Sie es so wie es ist!

Die Datenbank verpackt mehrere Bitfelder sehr effizient. Ich habe Leute gesehen, die Dinge wie ein 32-Bit-int-Feld machen, und ihnen so erlauben, ihre 17 booleschen Werte mit Bitmasken zu speichern und 'etwas Platz für zusätzliche Felder zu lassen'. Dies ist nur dumm, es ist ein Wartungs-Albtraum und Ihre Anfragen werden mit Bitmasken übersät, die sie schwierig zu pflegen machen.

Ich wiederhole, halten Sie es einfach, nur die booleschen Spalten haben. Wenn Sie eine neue Spalte benötigen, fügen Sie sie hinzu. Sie müssen keine separate Tabelle erstellen.

+0

@ 1: So geht es! Die gute alte KISS-Methode. (Halten Sie es einfach blöd) –