Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wann ist es besser, Flags als Bitmaske zu speichern, anstatt eine assoziative Tabelle zu verwenden?

Herrliche Frage!

Lassen Sie uns zunächst einige Annahmen über "besser" treffen.

Ich gehe davon aus, dass Sie sich nicht viel um Speicherplatz kümmern - eine Bitmaske ist aus Platzgründen effizient, aber ich bin mir nicht sicher, ob das viel ausmacht, wenn Sie SQL Server verwenden.

Ich nehme an, Sie kümmern sich um die Geschwindigkeit. Eine Bitmaske kann bei der Verwendung von Berechnungen sehr schnell sein - aber Sie können beim Abfragen der Bitmaske keinen Index verwenden. Dies sollte nicht allzu wichtig sein, aber wenn Sie wissen möchten, welche Benutzer Zugriff zum Erstellen haben, würde Ihre Abfrage etwa so aussehen:

select * from user where permsission & CREATE = TRUE

(habe heute unterwegs keinen Zugriff auf SQL Server). Diese Abfrage wäre aufgrund der mathematischen Operation nicht in der Lage, einen Index zu verwenden - wenn Sie also eine große Anzahl von Benutzern haben, wäre dies ziemlich schmerzhaft.

Ich gehe davon aus, dass Sie sich um die Wartbarkeit kümmern. Aus Sicht der Wartbarkeit ist die Bitmaske nicht so aussagekräftig wie die zugrunde liegende Problemdomäne wie das Speichern expliziter Berechtigungen. Sie müssten mit ziemlicher Sicherheit den Wert der Bitmasken-Flags über mehrere Komponenten hinweg synchronisieren - einschließlich der Datenbank. Nicht unmöglich, aber Schmerzen im Hintern.

Wenn es also keine andere Möglichkeit gibt, "besser" zu bewerten, würde ich sagen, dass die Bitmaskenroute nicht so gut ist wie das Speichern der Berechtigungen in einer normalisierten Datenbankstruktur. Ich stimme nicht zu, dass es "langsamer wäre, weil Sie einen Join machen müssen" - es sei denn, Sie haben eine völlig dysfunktionale Datenbank, können Sie dies nicht messen (während Abfragen ohne den Vorteil eines aktiven Index merklich werden können langsamer mit sogar ein paar tausend Datensätzen).