他の回答は、さまざまなオプションの長所と短所をうまく概説しています。
オプション 1 (プロパティ バッグ) は、特にプロパティ バッグの弱点に対する保護を組み込む場合、ほとんどのアプリケーションにとって最適な全体的な設計であると考えています。
次の ERD を参照してください。

上記の ERD では、USER_SETTING
テーブルは OP のものと非常によく似ています。違いは、varchar と列の代わりにCode
、この設計には、許容される設定 (コード) と値の相互に排他的な 2 つの列を定義Value
するテーブルへの FK があることです。SETTING
1 つのオプションは、あらゆる種類のユーザー入力を受け取ることができる varchar フィールドであり、もう 1 つは有効な値のテーブルへの FK です。
このSETTING
テーブルには、ユーザー設定を FK で定義するか、制約のない varchar 入力で定義するかを示すフラグもあります。に を追加しdata_type
て、SETTING
をエンコードおよび解釈する方法をシステムに指示することもできUSER_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
か、または を入力する必要があるかを決定し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 Fiddleでこれを参照してください。