2

ユーザーテーブルに加えて、Wordpressには次の列を持つusersmetaテーブルがあります

  • meta_id
  • ユーザーID
  • meta_key(例:first_name)
  • meta_value(例:Tom)

行にmeta_valueが入力されているかどうかに関係なく、各ユーザーのusersmetaテーブルには20行あります。そうは言っても、常に存在するメタ行をユーザーテーブルに追加する方が効率的ではないでしょうか。

usersテーブルの情報(user_id、username、passなど)がより頻繁に照会されるので、これらの行を小さく保つ方が効率的だと思います。これは本当ですか?そして、このテーブルの分離には他の理由がありますか?

4

2 に答える 2

5

エンティティ属性値

これはエンティティ属性値(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テーブルのスキーマを変更しなくても、好きな色でユーザーを簡単に見つけることができます。

于 2012-06-14T15:03:18.457 に答える
2

これは本当にデータベースの正規化に関する質問です。あなたは多くの場所でそのトピックに関する情報を探すことができます。

基本的な答えこれについては膨大な文献があり、多くの違いがあるため、これが発生する理由の例をいくつか示します。つまり、トレードオフになります。速度とストレージの要件、または使いやすさとデータの重複。効率は多次元であり、wordpressはさまざまなことを行うため、それらを分離する理由はさまざまです。スペースが問題になる可能性があり、クエリの速度はこれに依存する可能性があります。代わりにメタテーブルだけを見る方が簡単な場合があります。いくつかの目的のために完全なテーブルの、またはその逆。

さらに読むこれは深いトピックです、あなたはもっと学びたいかもしれません-これらの問題に関する何百もの本と何千もの学術論文があります。たとえば、データベースの設計に関するこの前のSOの質問を見てください。 データベースの設計:1つの巨大なテーブルまたは個別のテーブル?、またはこれ:初めてのデータベース設計:私は過剰設計ですか? またはAbout.comのデータベース正規化の基本 。

于 2012-06-14T14:42:57.960 に答える