エンティティ属性値
これはエンティティ属性値(EAV)データモデルと呼ばれ、任意の数の属性を特定のエンティティに割り当てることができます。これは、ユーザーごとに任意の数のメタデータエントリを意味します。
なぜそれを使うのか
デフォルトでは、ワードプレスが設定するいくつかのキー(質問で20が記載されています)がありますが、任意の数にすることができます。すべてのユーザーが1,000のメタデータエントリを持っている場合(各ユーザーのusermetaテーブルに1,000のエントリがあるだけです)、ユーザーが持つことができるメタデータエントリの数に(データベース構造の観点から)制限はありません。 。また、1人のユーザーが1000個のメタデータ全体を持つことを許可し、他のすべてのユーザーは20個を持ち、データを効率的に保存します。
柔軟性に加えて、この種の構造を使用すると、メインユーザーテーブルを小さく保つことができます。これは、より効率的なクエリを意味します。
代替案
EAVを使用する代わりの方法は次のとおりです。
- 属性の数が変わるたびにスキーマを変更する
- すべての属性をシリアル化された文字列に格納します(ユーザーオブジェクト上)
- スキーマレスデータベースを使用する
パーミッションは最初のポイントの最大の問題です。データベーステーブルのスキーマを変更するための包括的なアクセスを許可することはお勧めできません。また、ほとんどのWordPressインストール(wordpress.comまたはdbユーザーに変更権限がない共有ホスト上)。Mysqlには、 4096列と1行あたり65,535バイトのハード制限もあります。単一のテーブルに多数の列を格納しようとすると、クエリが非効率的なテーブルを作成する途中で、最終的に失敗します。
すべての属性をシリアル化された文字列に格納すると、メタデータ値によるクエリが困難になり、遅くなります。
Wordpressはmysqlと完全に結びついているため、データストアを変更することは現実的なオプションではありません。
詳細なWP情報
プラグインを使用していない場合は、ユーザーごとにusermetaテーブルに一定数の行がある可能性がありますが、通常、追加するプラグインごとにユーザーのメタデータを追加する必要があります。追加された数は簡単ではない可能性があり、このデータはusermetaテーブルに保存されます。
add_meta_userのドキュメントにより、データベースがそのように構造化されている理由が明確になる場合があります。このようなコードをどこかに置くと:
add_user_meta($user_id, "favorite_color", "blue");
メインのusersテーブルに列(favorite_color)を追加しなくても、指定されたuser_idのusermetaテーブルに行が作成されます。これにより、usersテーブルのスキーマを変更しなくても、好きな色でユーザーを簡単に見つけることができます。