Viele Bits speichern - Soll ich mehrere Spalten oder eine einzelne Bitfeldspalte verwenden?

8

Ich entwerfe eine Tabelle User in meiner Datenbank. Ich habe ungefähr 30 Optionen für jeden Benutzer, die entweder "erlauben" oder "nicht zulassen" haben können.

Meine Frage ist, ob ich diese als 30 bit Spalten speichern soll oder ob ich eine einzelne int Spalte verwenden soll, um sie zu speichern und jedes Bit in meiner Anwendung auszuwerten?

Außerdem ist unsere Datenbank SQL Server 2008 und 2005 (abhängig von der Umgebung)

    
Earlz 30.07.2010, 17:39
quelle

5 Antworten

4

Ich denke, es wäre einfacher, zukünftige Erweiterungen zuzulassen, wenn Sie Spalten für jeden Wert haben. Wenn Sie in der Zukunft eine weitere Option hinzufügen (was für die meisten Anwendungen wahrscheinlich ist), kann sich dies auf Ihren gesamten anderen Code auswirken, da Sie Ihre int-Spalte neu analysieren müssen, um die neuen Bits zu berücksichtigen.

    
JNK 30.07.2010, 17:47
quelle
11

Ich habe gerade versucht, zwei Tabellen zu erstellen, eine mit einer einzelnen int-Spalte und eine mit 30-bit-Spalten, dann fügte ich jeweils eine Zeile hinzu und betrachtete sie mit SQL Server Internal Viewer

%Vor%

Einzelne Zeile für Tabelle mit 30-Bit-Spalten

Einzelne Zeile für Tabelle mit einer int-Spalte

Aus Sicht des Speichers kombiniert SQL Server die Bitspalten und die Daten werden in genau der gleichen Menge an Speicherplatz (gelb) gespeichert. Sie verlieren jedoch 3 Byte pro Zeile für die NULL-Bitmap (lila), da die Länge davon direkt proportional zur Anzahl der Spalten ist (unabhängig davon, ob sie Nullen zulassen)

Taste für Felder (für die int-Version ist die Farbcodierung für die Bit-Version identisch)

    
Martin Smith 30.07.2010 18:25
quelle
5

Weder - es sei denn, Sie haben ein großes Platzproblem oder eine Kompatibilitätsanforderung mit einem anderen System. Denken Sie darüber nach, wie Sie dadurch Ihre Abfragen nicht optimieren und klar verstehen, was jedes Bit darstellt.

Sie können mehr als tausend Spalten in einer Tabelle haben, oder Sie können eine untergeordnete Tabelle für Benutzereinstellungen haben. Warum beschränken Sie sich auf 30 Bits, die Sie in Ihrer App analysieren müssen? Stellen Sie sich vor, welche Änderungen Sie an der App vornehmen müssen, wenn mehrere dieser Einstellungen veraltet sind oder einige neue Einstellungen eingeführt wurden.

    
Cahit 30.07.2010 17:47
quelle
4

Wenn Sie zu einem Bitflag-Feld kombinieren, wird es schwierig zu sehen, was eingestellt ist, wenn Sie die Rohdaten betrachten. Ich würde mit einzelnen Spalten für jeden Wert gehen oder die Optionen in einer eigenen Tabelle speichern.

    
BlackICE 30.07.2010 17:50
quelle
1

Ich stimme zu, dass Ihr Entwurf ordnungsgemäß normalisiert werden sollte, drei Tabellen Benutzer- und Benutzereinstellungen und eine Bridge-Tabelle:

Benutzer:

Benutzer-ID int

Benutzername varchar (X)

Benutzereinstellung :

Einstellungsid int

Einstellungsname varchar (X)

UserUserSetting:

Benutzer-ID int

Einstellungs-ID int

IsSet-Bit

Zwischen der Bridge-Tabelle UserUserSetting und der Tabelle UserSetting und der User-Tabelle und einer eindeutigen contr-Einschränkung von t UserId, SettingId in UserUserSetting

    
JasonHorner 31.07.2010 03:57
quelle