sql >> データベース >  >> RDS >> Sqlserver

連想テーブルを使用するよりも、フラグをビットマスクとして保存する方がよいのはいつですか。

    素晴らしい質問です!

    まず、「より良い」についていくつかの仮定を立てましょう。

    ディスクスペースについてはあまり気にしないと思います。スペースの観点からはビットマスクは効率的ですが、SQLサーバーを使用している場合はそれがそれほど重要かどうかはわかりません。

    私はあなたがスピードを気にしていると思います。計算を使用する場合、ビットマスクは非常に高速になる可能性がありますが、ビットマスクを照会するときにインデックスを使用することはできません。これはそれほど重要ではありませんが、どのユーザーが作成アクセス権を持っているかを知りたい場合、クエリは次のようになります

    select * from user where permsission & CREATE = TRUE
    

    (今日、外出先でSQL Serverにアクセスできていません)。そのクエリは、数学演算のためにインデックスを使用できません。したがって、ユーザー数が非常に多い場合、これは非常に苦痛になります。

    保守性に気を配っていると思います。保守性の観点から、ビットマスクは、明示的なアクセス許可を格納するほど、根本的な問題ドメインほど表現力がありません。データベースを含む複数のコンポーネント間でビットマスクフラグの値を同期する必要があることはほぼ間違いありません。不可能ではありませんが、裏側の痛み。

    したがって、「より良い」を評価する別の方法がない限り、ビットマスクルートは、正規化されたデータベース構造にアクセス許可を格納するほど良くはないと思います。 「結合を行う必要があるため、遅くなる」ことに同意しません。完全に機能不全のデータベースがない限り、これを測定することはできません(一方、アクティブなインデックスを利用せずにクエリを実行すると、著しく低下する可能性があります)数千レコードでも遅くなります)。



    1. Neo4j-Cypherを使用してノードを削除する

    2. リンクサーバーでのログインのしくみ(T-SQLの例)

    3. SQL Serverでレコードを削除した後、IDシードをリセットします

    4. SQL Server(T-SQL)でユーザーのデフォルト言語を見つける方法