2017-10-13 2 views
1

Ich bin kein DB-Experte, und nicht sicher, welcher Ansatz der beste sein würde, wenn es darum geht, meine Tabelle abzufragen.SQL Server: bitweise oder separate Felder

Ich habe eine Tabelle Availability, die die Tage der Woche enthält, die ein bestimmter Benutzer verfügbar ist, um zu arbeiten.

Ich habe mein Modell wie dieses

 monday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 
    tuesday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 
    wednesday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 
    thursday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 
    friday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 
    saturday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 
    sunday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 

Jetzt definiert, ich frage mich, wäre es nicht schneller sein, wenn es für alle meine Benutzer zur Verfügung arbeiten zum Beispiel zur Abfrage kommt am Montag, um eine einzelne Spalte zu haben, die eine bitweise Ganzzahl enthält, also kann ich sie einfügen, indem ich alle Werte addiere und frage ihn mit dem OR bitweisen Operator in SQL Server ab?

Vielen Dank für Ihre Hilfe :)

Julien.

Antwort

1

Fragen Sie, ob es möglich ist oder ob es ein guter Ansatz ist?

Ich habe umfangreiche Arbeit an einem Job-Scheduling-Tool gemacht und mein Team hat den SQL-Agent-Job-Scheduler in SQL Server als Basis verwendet. Unter dem Deckblatt speichert der SQL-Agent-Scheduler den Zeitplan in einer Tabelle und einige der Spalten sind codiert, um bitweise Operationen gegen sie zu verwenden.

Da es nur 7 Tage in der Woche gibt, können Sie einen Datentyp tinyint (1 Byte = 8 Bit) verwenden, um diese Verfügbarkeitsdaten zu speichern.

Ob01000000 could be Monday = 64 
0b00100000 could be Tuesday = 32 
etc. 

Dann, wenn Sie die Daten aus einer Abfrage ziehen ...

WHERE Availability.AvailableDays | 64 = 64 

wird Ihnen jeder, der am Montag arbeitet.

Persönlich mag ich diesen Ansatz für diese Art von Problemen.

+0

Hallo @thomas, ich frage mich nur, was wäre die beste Praxis hier. Das sieht in der Tat gut aus. Ich werde es versuchen.Danke :) – Julien

0

Intern implementiert SQL Server Bitspalten als Byteblock in SQL Server.

Das SQL Server-Datenbankmodul optimiert die Speicherung von Bitspalten. Wenn 8 oder weniger Bitspalten in einer Tabelle sind, werden die Spalten als 1 Byte gespeichert. Wenn Spalten von 9 bis 16 Bit vorhanden sind, werden die Spalten als 2 Byte gespeichert und so weiter.

BOL Source

würde ich bit Spalten mit empfehlen. Die Datenbank führt alle bitweisen Manipulationen für Sie durch, sodass Sie bequeme und leicht zu lesende Filterkriterien wie where [wednesday] = 1 schreiben können.

Außerdem verhindert das Schema selbst, dass versucht wird, einen ungültigen Wert in Ganzzahlspalten wie tinyint und smallint festzulegen. Angenommen, Sie richten eine Tinyint-Spalte ein, die 7 Bit zulässt. Dies beschränkt die Werte von 0 bis 127. Eine Prüfbedingung wäre erforderlich, um zu verhindern, dass jemand das oberste Bit setzt und Werte zwischen 128 und 255 (einschließlich) verhindert.

+0

Hi @ paul-williams, danke für deine Antwort, ich denke tatsächlich, Sequelize würde standardmäßig ein BIT erstellen, das ist die aktuelle Implementierung, die ich habe. Jetzt werde ich sagen, wie perfs sind. – Julien

Verwandte Themen