すべてのユーザーに対して常に設定されるものについては、通常の正規化に従って、テーブルに保持する傾向があります。オプションの構成に関しては、次のテーブル構造が好きです。Users
TABLE Users:
id INT AI
name VARCHAR
...
TABLE User_Settings
user_id INT PK,FK
name VARCHAR PK
type BOOL
value_int INT NULL
value_str VARCHAR NULL
WhereUser_Settings.type
は、整数フィールドまたは文字列フィールドのどちらを参照するかを指定します。
すなわち:
INSERT INTO Users (id, name) VALUES (1, 'Sammitch');
INSERT INTO User_Settings (user_id, name, type, value_int) VALUES (1, 'level', 1, 75);
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'en');
また、INSERT/UPDATE の問題については、次のようになります。
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'fr')
ON DUPLICATE KEY UPDATE value_str='fr';
また、他のほとんどの人が言っているように、設定をシリアル化して保存することは、次の理由から特に良い考えではありません。
- クエリで単一の値を取得することはできません。シリアル化された文字列全体を取得し、逆シリアル化し、不要なデータを破棄する必要があります。
- 壊れやすく、元に戻すのは困難です。
- 生のクエリを書くのは大変です。つまり、特定の設定をグローバルに修正します。
- 基本的に表形式のデータを 1 つのテーブル フィールドに格納しています。
2016 年 9 月回顧録編集:
それまでの間、オプションの設定を保存する最善の方法と、上で定義した一般的なテーブル構造について、人々といくつかの議論をしました。
そのテーブル構造は完全に悪いわけではありませんが、まったく良いわけでもありません。それは、悪い状況を最大限に活用しようとしています。オプション設定のシリアル化は、次の設定に対応できる限り機能します。
- すべてが一度にロードされ、ピッキングや選択はありません。
- インデックス可能、検索可能、またはまとめて簡単に変更できない。
次に、シリアル化された [例: JSON] 形式の設定を含む表のようなフィールドを追加することを検討してoptional_settings
ください。Users
上記をトレードオフしますが、より簡単なアプローチであり、より複雑な設定を保存できます。
また、ストレージのような LOB タイプを使用する場合、TEXT
少なくとも MySQL では、データは必ずしも「行に」格納されるとは限りません。
とにかく、アプリケーションの要件と制約が何であるかを判断し、その情報に基づいて最適な選択を行うのはあなた次第です。