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)
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.
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)
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.
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
Tags und Links sql sql-server-2005 sql-server-2008 database-design bit-fields