エンティティ属性値 (EAV) データベースは、その制限、特に非効率な設計とレポート作成の課題で批判されています。タイプに基づいてエンティティ属性を分離することにより、EAV 追跡履歴データの利点を維持しながら、これらの欠点を克服できます。
提案されたスキーマでは、各エンティティ タイプの属性を分類するマスター属性テーブルが導入されています。これにより、オプション、整数、日付、文字列、テキスト、小数など、さまざまな属性タイプの処理が可能になります。
<code>entity_type { id, type, // 例如,“博客”、“用户”、“产品”等 created_at } entity { id, entity_type_id, created_at } attr { id, entity_id, type, name, created_at } option { id, attr_id, entity_id, multiple, // 允许多个值? name, created_at } attr_option { id, attr_id, entity_id, option_id, option, created_at } attr_int { attr_id, entity_id, int, created_at } attr_relation { attr_id, entity_id, entity_fk_id, created_at } attr_datetime { attr_id, entity_id, datetime, created_at } attr_string { attr_id, entity_id, var_char, created_at } attr_text { attr_id, entity_id, text, created_at } attr_decimal { attr_id, entity_id, decimal, created_at }</code>
エンティティ タイプの取得:
<code> SELECT * FROM entity_type et LEFT JOIN entity e ON e.entity_type_id = et.id WHERE e.id = ?</code>
エンティティ属性の取得:
<code> SELECT * FROM attr WHERE entity_id = ?</code>
属性値の取得:
<code> SELECT * FROM attr_option, attr_int, attr_relation, attr_text, ... WHERE entity_id = ?</code>
エンティティ間の関係を検索します:
<code> SELECT * FROM entity AS e LEFT JOIN attr_relation AS ar ON ar.entity_id = e.id WHERE ar.entity_id = 34 AND e.entity_type = 2;</code>
従来の EAV 設計機能は改善されていますが、考慮すべき潜在的な問題がまだいくつかあります。
以上が属性を区別して効率的な履歴データ管理を行うための EAV データベースを設計するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。