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

MySQLにユーザー設定を保存する最良の方法は?

    常に すべてに設定 ユーザーは、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';
    

    また、他のほとんどの人が言っているように、設定をシリアル化して保存することは、特に良い考えではありません。理由は次のとおりです。

    1. クエリで単一の値を取得することはできません。シリアル化された文字列全体を取得し、シリアル化を解除して、不要なデータを破棄する必要があります。
    2. 簡単に破損し、回復が困難です。
    3. 特定の設定をグローバルに修正するなどの生のクエリを作成するのは、戦利品の苦痛です。
    4. 基本的に表形式のデータを単一のテーブルフィールドに保存しています。

    2016年9月の回顧的編集:

    その間に、オプションの設定を保存するのに最適な方法と、上記で定義した一般的なテーブル構造について、人々といくつかの議論をしました。

    そのテーブル構造は完全に悪いわけではありませんが 、正確には良いではありません また。それは悪い状況を最大限に活用しようとしています。オプション設定のシリアル化は、これらの設定に対応できる限り機能します。

    1. すべてが一度に読み込まれ、選択したり選択したりする必要はありません。
    2. インデックス作成、検索、または簡単に変更できない

    次に、optional_settingsのようなフィールドを追加することを検討してください。 Users シリアル化された[例:JSON]形式の設定を含むテーブル。上記をトレードオフしますが、これはより簡単なアプローチであり、より複雑な設定を保存できます。

    また、TEXTのようなLOBタイプを使用する場合 保存のために、データは必ずしも少なくともMySQLでは「行に」保存されるとは限りません。

    とにかく、それはあなた次第です アプリケーションの要件と制約を判断し、その情報に基づいて最適な選択を行います。



    1. Laravel-5'LIKE'相当(Eloquent)

    2. 単一のSQLステートメントの列ヘッダー出力を抑制するにはどうすればよいですか?

    3. テーブルの主キー値を更新できますか?

    4. PgBackRestをインストールする方法