質問

私のアプリケーションでは、ユーザーに就業日を選択してもらいたいと思います。次に、データベースに保存します。もちろん、私のアプリケーションでは、ユーザーのデータを処理します。今日は、今日働くべきユーザーである特定のユーザーの営業日です。

私の質問は、これを行うためのベストプラクティスは何ですか?使用する必要があります:

  1. ユーザーテーブルのビットマスクフィールド
  2. 多くの関係の多くの関係テーブルは、日、ユーザー、days_usersのテーブルを作成します。前もって感謝します。
役に立ちましたか?

解決

ビットマスクフィールドはリレーショナルアンチパターンだと思います。

フィールドには単一の意味のある値が必要です。そうしないと、問題の照会になります。使用する必要があるたびにフィールドを解析する必要があります。

このようなフィールドには、保存する値が自己記述ではないため、追加のドキュメントも必要です。

他のヒント

ビットマスクフィールドは本質的にもう少し不可解であり、ビットマスクに保存しているものを解釈するために何か他のものを作成する必要があります。

2番目のアプローチは、はるかに透明性が高く、簡単に理解できるものであり、値を追加する必要がある場合はもう少し柔軟です。ビットマスクを使用すると、リレーショナルアプローチと比較してメンテナンスの悪夢になる値を追加するたびに、ビットマップデコーダーを再びやり直す必要があります。

私はオプション1を使用するという間違いを犯しました、そして、時間をさかのぼる機会を与えられて、私はそれを逆に絶対にやるでしょう。

データベースは、ほぼ間違いなく、インデックスを使用してビットマスクにビットワイズクエリを作成しません。したがって、たとえば、火曜日に働いているすべての人を見つけたい場合は、毎回インデックススキャンを行います。テーブルが大きくなると、パフォーマンスを破壊する可能性があります。あなたはキャッシュすることによってこれを最適化しようとすることができます SELECT DISTINCT(bitmaskfield) 事前に、あなた自身のアプリケーションでビットマスクロジックを実行し、それを適切なものに課します WHERE bitmaskfield IN (...) 節ですが、データベース内の値を変更するすべての場所で個別のビットマスクキャッシュを更新する必要があるため、すぐに維持できなくなります。

余分なテーブルと結合は痛みのように思えるかもしれませんが、ビットマスクは悪化します。これについて私を信じてください。データベースをデータベースとして使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top