常に すべてに設定 ユーザーは、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
User_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';
また、他のほとんどの人が言っているように、設定をシリアル化して保存することは、特に良い考えではありません。理由は次のとおりです。
- クエリで単一の値を取得することはできません。シリアル化された文字列全体を取得し、シリアル化を解除して、不要なデータを破棄する必要があります。
- 簡単に破損し、回復が困難です。
- 特定の設定をグローバルに修正するなどの生のクエリを作成するのは、戦利品の苦痛です。
- 基本的に表形式のデータを単一のテーブルフィールドに保存しています。
2016年9月の回顧的編集:
その間に、オプションの設定を保存するのに最適な方法と、上記で定義した一般的なテーブル構造について、人々といくつかの議論をしました。
そのテーブル構造は完全に悪いわけではありませんが 、正確には良いではありません また。それは悪い状況を最大限に活用しようとしています。オプション設定のシリアル化は、これらの設定に対応できる限り機能します。
- すべてが一度に読み込まれ、選択したり選択したりする必要はありません。
- インデックス作成、検索、または簡単に変更できない 。
次に、optional_settings
のようなフィールドを追加することを検討してください。 Users
シリアル化された[例:JSON]形式の設定を含むテーブル。上記をトレードオフしますが、これはより簡単なアプローチであり、より複雑な設定を保存できます。
また、TEXT
のようなLOBタイプを使用する場合 保存のために、データは必ずしも少なくともMySQLでは「行に」保存されるとは限りません。
とにかく、それはあなた次第です アプリケーションの要件と制約を判断し、その情報に基づいて最適な選択を行います。