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

ユーザー設定のためのデータベース設計

    他の回答は、さまざまなオプションの長所と短所をうまく概説しています。

    オプション1(プロパティバッグ)は、ほとんどのアプリケーションに最適な全体的な設計であると思います。特に、プロパティバッグの弱点に対する保護を組み込む場合はそうです。

    次のERDを参照してください:

    上記のERDでは、USER_SETTING テーブルはOPと非常によく似ています。違いは、varchar Codeの代わりに およびValue 列、このデザインにはSETTINGへのFKがあります 許容設定(コード)と値の2つの相互に排他的な列を定義するテーブル。 1つのオプションは、あらゆる種類のユーザー入力を受け取ることができるvarcharフィールドであり、もう1つは、有効な値のテーブルへのFKです。

    SETTING テーブルには、ユーザー設定をFKで定義するか、制約のないvarchar入力で定義するかを示すフラグもあります。 data_typeを追加することもできます SETTINGUSER_SETTING.unconstrained_valueをエンコードして解釈する方法をシステムに指示する 。必要に応じて、SETTING_GROUPを追加することもできます ユーザーメンテナンスのさまざまな設定を整理するのに役立つ表。

    この設計により、設定が何であるかに関するルールをテーブルドライブすることができます。これは便利で柔軟性があり、メンテナンスが簡単ですが、誰でも自由に利用できます。

    編集: いくつかの例を含む、さらにいくつかの詳細...

    上記のERDは、より多くの列の詳細(SETTINGの範囲値とALLOWED_SETTING_VALUEの列)で拡張されていることに注意してください。

    これが説明のためのいくつかのサンプルレコードです。

    SETTING:
    +----+------------------+-------------+--------------+-----------+-----------+
    | id | description      | constrained | data_type    | min_value | max_value |
    +----+------------------+-------------+--------------+-----------+-----------+
    | 10 | Favourite Colour | true        | alphanumeric | {null}    | {null}    |
    | 11 | Item Max Limit   | false       | integer      | 0         | 9001      |
    | 12 | Item Min Limit   | false       | integer      | 0         | 9000      |
    +----+------------------+-------------+--------------+-----------+-----------+
    
    ALLOWED_SETTING_VALUE:
    +-----+------------+--------------+-----------+
    | id  | setting_id | item_value   | caption   |
    +-----+------------+--------------+-----------+
    | 123 | 10         | #0000FF      | Blue      |
    | 124 | 10         | #FFFF00      | Yellow    |
    | 125 | 10         | #FF00FF      | Pink      |
    +-----+------------+--------------+-----------+
    
    USER_SETTING:
    +------+---------+------------+--------------------------+---------------------+
    | id   | user_id | setting_id | allowed_setting_value_id | unconstrained_value |
    +------+---------+------------+--------------------------+---------------------+
    | 5678 | 234     | 10         | 124                      | {null}              |
    | 7890 | 234     | 11         | {null}                   | 100                 |
    | 8901 | 234     | 12         | {null}                   | 1                   |
    +------+---------+------------+--------------------------+---------------------+
    

    これらの表から、決定できるユーザー設定の一部は、お気に入りの色、アイテムの最大制限、およびアイテムの最小制限であることがわかります。お気に入りの色は英数字の選択リストです。アイテムの最小および最大制限は、許容範囲の値が設定された数値です。 SETTING.constrained 列は、ユーザーが関連するALLOWED_SETTING_VALUEから選択しているかどうかを判別します sまたはUSER_SETTING.unconstrained_valueを入力する必要があるかどうか 。ユーザーが設定を操作できるようにするGUIは、提供するオプションと、両方のSETTING.data_typeを適用する方法を理解する必要があります。 およびmin_value およびmax_value 制限がある場合は、制限します。

    この設計を使用すると、ユーザーが選択(または入力)した値にいくつかの基本的な制約/健全性チェックを実施するのに十分なメタデータを含む許容設定をテーブルドライブできます。

    編集:クエリの例

    上記のデータを使用して特定のユーザーIDの設定値を一覧表示するサンプルSQLを次に示します。

    -- DDL and sample data population...
    CREATE TABLE SETTING
        (`id` int, `description` varchar(16)
         , `constrained` varchar(5), `data_type` varchar(12)
         , `min_value` varchar(6) NULL , `max_value` varchar(6) NULL)
    ;
    
    INSERT INTO SETTING
        (`id`, `description`, `constrained`, `data_type`, `min_value`, `max_value`)
    VALUES
        (10, 'Favourite Colour', 'true', 'alphanumeric', NULL, NULL),
        (11, 'Item Max Limit', 'false', 'integer', '0', '9001'),
        (12, 'Item Min Limit', 'false', 'integer', '0', '9000')
    ;
    
    CREATE TABLE ALLOWED_SETTING_VALUE
        (`id` int, `setting_id` int, `item_value` varchar(7)
         , `caption` varchar(6))
    ;
    
    INSERT INTO ALLOWED_SETTING_VALUE
        (`id`, `setting_id`, `item_value`, `caption`)
    VALUES
        (123, 10, '#0000FF', 'Blue'),
        (124, 10, '#FFFF00', 'Yellow'),
        (125, 10, '#FF00FF', 'Pink')
    ;
    
    CREATE TABLE USER_SETTING
        (`id` int, `user_id` int, `setting_id` int
         , `allowed_setting_value_id` varchar(6) NULL
         , `unconstrained_value` varchar(6) NULL)
    ;
    
    INSERT INTO USER_SETTING
        (`id`, `user_id`, `setting_id`, `allowed_setting_value_id`, `unconstrained_value`)
    VALUES
        (5678, 234, 10, '124', NULL),
        (7890, 234, 11, NULL, '100'),
        (8901, 234, 12, NULL, '1')
    ;
    

    そして今、DMLはユーザーの設定を抽出します:

    -- Show settings for a given user
    select
      US.user_id 
    , S1.description 
    , S1.data_type 
    , case when S1.constrained = 'true'
      then AV.item_value
      else US.unconstrained_value
      end value
    , AV.caption
    from USER_SETTING US
      inner join SETTING S1
        on US.setting_id = S1.id 
      left outer join ALLOWED_SETTING_VALUE AV
        on US.allowed_setting_value_id = AV.id
    where US.user_id = 234
    

    SQLフィドルでこれを参照してください。



    1. MariaDBでのUNCOMPRESS()のしくみ

    2. ORA-01882:タイムゾーン領域が見つかりません

    3. ORA-06508:PL / SQL:呼び出されているプログラム・ユニットが見つかりませんでした

    4. T-SQLを使用して2つの整数値を除算してfloat結果を取得するにはどうすればよいですか?