2017-10-13 11 views
1

私はDBの専門家ではなく、自分のテーブルを照会する際にどのようなアプローチがベストであるかは不明です。SQL Server:ビット単位または別個のフィールド

私はテーブルAvailabilityを持っています。このテーブルには、特定のユーザーが作業できる曜日が含まれています。

私はそれが私のすべてのユーザーのために、例えば仕事に利用できる照会に来るとき今、私は疑問に思って、それは、より高速ではないでしょう。この

 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, 
    }, 

ように私のモデルを定義しています月曜日にビット単位の整数を含む単一の列を持つために、SQL Serverのビット演算子ORを使用してすべての値とクエリを追加して挿入できますか?

あなたのおかげでありがとう:

ジュリアン。

答えて

1

可能かどうか、それともよいアプローチですか?

私はジョブスケジューリングツールに関する広範な作業を行いました。私のチームはSQL ServerでSQL Agentジョブスケジューラを使用して作業を開始しました。その中で、SQLエージェントスケジューラはテーブルにスケジュールを格納しており、一部の列はビット単位の操作を使用するようにコーディングされています。

週にわずか7日しかないので、この可用性データを格納するためにデータタイプ(1バイト= 8ビット)を使用することができます。あなたは、クエリ内からデータを引き出したときに

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

その後...

WHERE Availability.AvailableDays | 64 = 64 

はあなたの月曜日に動作します誰が得られます。

個人的には、私はこれらのタイプの問題に対してこのアプローチが好きです。

+0

こんにちは、私はちょうどここでベストプラクティスになるだろうと思っています。それは確かに良いアプローチのように見えます。私は試してみます。ありがとう:) – Julien

0

内部的にSQL Serverは、ビット列をSQL Serverのバイトブロックとして実装しています。

SQL Serverデータベースエンジンは、ビット列の格納を最適化します。 テーブルに8ビット以下のカラムがある場合、カラムは 1バイトとして格納されます。 9〜16ビットの列がある場合、列は が2バイトとして格納されます。以下同様です。

BOL Source

私はbitカラムを使用することをお勧めします。データベースはすべてのビット単位の操作を実行するので、便利で読みやすいフィルタ基準(where [wednesday] = 1など)を書くことができます。

また、スキーマ自体は、tinyintsmallintのような整数列に無効な値を設定しようとする試みを防ぎます。たとえば、7ビットを許可するtinyintカラムを設定するとします。これにより、値が0から127に制限されます。チェック制約は、誰かが最上位ビットを設定するのを防ぎ、値が128から255(両端を含む)にならないようにするために必要です。

+0

こんにちは@ポール - williams、あなたの応答のおかげで、私は確かにSequelizeは、デフォルトではBITを作成すると思う、それは私の現在の実装です。今、私はパーフェクスがいかにあるかをlpplします。 – Julien

関連する問題