ホームページ >データベース >mysql チュートリアル >EAV データベース設計は効率的な履歴データ管理のための適切なソリューションですか?
EAV データベース設計: 履歴データ管理アプローチ
エンティティ-属性-値 (EAV) データベース モデルは、潜在的なデータの整合性やレポート作成の課題で批判されることがよくありますが、履歴データの追跡と SQL およびキーバリュー ストア環境の橋渡しにおいて利点を提供します。 この記事では、これらの懸念を軽減するための洗練された EAV アプローチについて説明します。
データ型ごとのエンティティ属性の整理
従来の EAV に対する主な改善点は、データ型に基づいてエンティティ属性を分離することです。 これにより、関係 (例: "belongsTo"、"has"、"hasMany"、"hasManyThrough") の管理が容易になり、属性とエンティティの適切なインデックス作成が可能になります。
提案されたリレーショナルスキーマ
次のリレーショナル データベース スキーマが提案されています:
<code class="language-sql">entity_type { id, type, -- e.g., "product," "user" created_at } entity { id, entity_type_id, created_at } attr { id, entity_id, type, name, created_at } option { id, attr_id, entity_id, multiple, -- Allow multiple values name, created_at } attr_option { id, attr_id, entity_id, option_id, option, created_at } -- Additional tables for various attribute types (e.g., attr_int, attr_datetime)</code>
履歴データの追跡
このスキーマは、新しい属性値を追加し、タイムスタンプを利用して最新の変更を識別することにより、履歴データの追跡を可能にします。 これにより、完全な変更履歴を保持しながら、データ更新の必要性が回避されます。
クエリの例
クエリの例はデータの取得を示しています:
エンティティタイプの取得:
<code class="language-sql"> SELECT * FROM entity_type et LEFT JOIN entity e ON e.entity_type_id = et.id WHERE e.id = ?</code>
エンティティ属性の取得:
<code class="language-sql"> SELECT * FROM attr WHERE entity_id = ?</code>
属性値の取得 (単一値および複数の値):
<code class="language-sql"> SELECT * FROM attr_option WHERE entity_id = ? AND multiple = 0 ORDER BY created_at DESC LIMIT 1 -- Single Value SELECT * FROM attr_int WHERE entity_id = ? ORDER BY created_at DESC LIMIT 1 -- Integer Value -- ... other attribute type queries</code>
関係の取得:
<code class="language-sql"> 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 データベース設計は効率的な履歴データ管理のための適切なソリューションですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。