Vor nicht allzu langer Zeit habe ich mit meinem Kollegen gesprochen und er war definitiv gegen die Verwendung von Bitmasken, da es schwierig ist, alle in der Datenbank gespeicherten Werte zu verstehen. Meiner Meinung nach ist es nicht immer eine schlechte Idee, sie zu verwenden, um beispielsweise die Rollen des aktuellen Benutzers zu bestimmen. Andernfalls müssen Sie es in einer separaten Tabelle speichern, was zu einem weiteren JOIN führt. Kannst du mir bitte sagen, ob ich falsch liege? Irgendwelche anderen Nebenwirkungen, Vor- / Nachteile der Verwendung von Bitmasken?
database
patterns-and-practices
bit
advantages
Alex Ovechkin
quelle
quelle
Antworten:
Ich arbeite mit einer Anwendung, die Bitmasken zum Speichern von Benutzerrollenzuweisungen verwendet. Es ist ein Schmerz im Hintern. Wenn das mich voreingenommen macht, schuldig wie angeklagt.
Wenn Sie bereits eine relationale Datenbank verwenden, ist dies ein Anti-Pattern, das gegen die meisten relationalen Theorien und alle Normalisierungsregeln verstößt. Wenn Sie Ihren eigenen Datenspeicher erstellen, ist dies möglicherweise keine so schlechte Idee.
Es werden zu viele Tabellen verknüpft, aber dafür werden relationale Datenbanken erstellt. Viele haben zusätzliche Funktionen, wenn die Leistung zu einem Problem wird: Indizes, indizierte Ansichten usw. Auch wenn sich die Werte, nach denen Sie suchen, nicht sehr oft ändern, was für Bitmask von Vorteil ist, ist der Mehraufwand für die Verwaltung der Indizierung ziemlich einfach in der Datenbank.
Obwohl die Datenbank Daten gut aggregiert, kann es zu Verzögerungen kommen, wenn Sie beispielsweise komplexe Formeln oder Skalarfunktionen in Datasets einfügen. Sie können das bitweise in Ihrer App tun, aber wenn Sie nur verwandte Daten abrufen (die Rolle (n) eines Benutzers nachschlagen), können Sie nicht ausnutzen, was Ihre Datenspeicherung am besten kann.
Mein letztes Argument dagegen wäre die Einfachheit für andere Entwickler. Sie haben Benutzer, Rollen und Zuordnungen. Es ist eine Menge von vielen Beziehungen (da es mehr als eine Beziehung gibt), die so häufig vorkommt, dass sie einfach zu verwalten sein sollte. Es ist nur CRUD Zeug.
quelle
where some_bit_mask & 12 > 0
ohne zeilenweisen Scan nicht nach Zeilen suchen können .user_role_map
oderuser_priv_map
hätte Tabelle genügt.Sie haben die relevanten Vor- und Nachteile bereits benannt:
Für die Entscheidung, was zu tun ist, sind weitere Informationen erforderlich:
Sie müssen also die Risikofaktoren erfassen und sie dann gewichten , um festzustellen, ob die Vorteile die Nachteile überwiegen.
quelle
Wenn Sie wirklich, wirklich , wirklich für Speicherplatz geschnallt, dann sind Sie möglicherweise Bitmaps für Benutzerberechtigungen prüfen. Wenn Sie sich Sorgen um die Leistung machen, vergessen Sie sie vollständig, da das Auseinandernehmen tatsächlich langsamer ist. Sie können ein Bitmap-Feld nicht sinnvoll indizieren , was zu Datenbanktabellen-Scans führt, die [fast] immer einen Performance-Killer darstellen.
Sofern Sie nicht Amazon oder Netflix sind, ist die Datenmenge , die für die Benutzerberechtigungen erforderlich ist, im Vergleich zu allen anderen Daten , die Sie besitzen , vernachlässigbar.
Jedes seriöse DBMS kann mit diesem "zusätzlichen Join" umgehen, ohne zu blinken.
quelle
Damals, als Lagerung teuer war, war der Segen mit Bitmasken, dass sie Platz sparten. In Zeiten von Big Data war dies nicht mehr das Problem.
Das Beispiel, das Sie zitieren, zu nehmen - Rollen als Bitmaske zu speichern, wäre aus Sicht des Datenbankdesigns ein gewisser Codegeruch, da dies gegen die erste Normalform verstoßen würde . In diesem Sinne sind sie ein Anti-Muster.
Trotzdem muss es nicht das eine oder andere sein. Sie können die Daten als Bitmaske speichern und dann über eine Ansicht verfügen, mit der die Benutzerrollen im Handumdrehen abgerufen werden können. Sie haben dann auch den Vorteil, auf einen Blick zu überprüfen, welche Benutzer die gleichen Rollen haben.
quelle
Der einzige Vorteil bei der Verwendung von Bitmasken besteht darin, dass die Bedeutung der Bitfelder nicht statisch ist. Relationale Tabellen funktionieren nur dann gut, wenn Sie im Voraus wissen, welche Felder sich in einem Datensatz befinden: Sie müssen die Felder in der
CREATE TABLE
DDL-Anweisung schließlich identifizieren .Wenn die Bedeutung jedes Bitfelds zur Laufzeit konfigurierbar ist oder anderweitig nicht im Voraus bekannt ist, ist es möglicherweise sinnvoll, Boolesche Werte als Bitfeld zu speichern. Selbst dann ist es möglich , eine Tabelle mit beliebigen Feldern zu definieren:
field_1
,field_2
usw. Dies gibt Ihnen ein sauberere relationales Design, wenn auch noch nicht ideal. Ob dies einem Bitfeld vorgezogen wird, ist weitgehend Ansichtssache, da keine der beiden Lösungen ideal ist.Wenn Sie wissen, was die Bits während der Entwicklung darstellen, erstellen Sie Felder für jedes Bit und geben Sie ihnen aussagekräftige Namen .
Achten Sie nur auf den inneren Plattformeffekt . Wenn Sie am Ende beliebige, aber gut typisierte Felder definieren, ist das eine Sache, aber wenn Sie zu weit gehen, werden Sie eine relationale Datenbank neu erfinden ... innerhalb einer relationalen Datenbank.
quelle
Ich bin ambivalent zu Bitmasken. Ich finde, dass die meisten ihrer Kritiker binär und hexadezimal nicht verstehen. Verwenden Sie zur Verdeutlichung gute Mnemonik.
Ein Vorteil, der oben nicht erwähnt wurde, ist die Möglichkeit, Bitmasken eine neue Bedeutung zu verleihen, ohne dass eine neue Spalte hinzugefügt werden muss. Unsere DB-Designer (die mir vorausgegangen sind) haben sie in einer Tabelle, die jetzt täglich 5 Millionen neue Datensätze erhält. Das Hinzufügen einer neuen Spalte, um ein neues Verhalten darzustellen, würde viel Zeit in Anspruch nehmen, während das Definieren eines neuen Bits (33 von 64) keine erneute Tabellenerstellung erfordert.
Nein, Bitmasken können nicht indiziert werden, aber das Erstellen von 33 Indizes wäre lächerlich und würde das Einfügen in einen Crawl verlangsamen. Tabellensuchen verwenden die Indizes "Eigentümer" für Datums- und Datensatzangaben, daher werden Indizes für diese Bitmaske, wenn möglich, niemals verwendet.
quelle
Wenn das Ziel nur darin besteht, Speicherplatz zu sparen, halte ich das für eine schlechte Idee:
Es gibt jedoch einige Fälle, die die Verwendung von Bitfeldern rechtfertigen können:
quelle