Reka Bentuk Pangkalan Data EAV: Pendekatan Pengurusan Data Bersejarah
Model pangkalan data Entity-Attribute-Value (EAV), walaupun sering dikritik kerana potensi integriti data dan cabaran pelaporan, menawarkan kelebihan dalam menjejak data sejarah dan merapatkan SQL dan persekitaran stor nilai kunci. Artikel ini meneroka pendekatan EAV yang diperhalusi untuk mengurangkan kebimbangan ini.
Mengatur Atribut Entiti mengikut Jenis Data
Peningkatan utama kepada EAV tradisional ialah pengasingan atribut entiti berdasarkan jenis datanya. Ini memudahkan pengurusan perhubungan (cth., "belongsTo," "has," "hasMany," "hasManyThrough") dan membenarkan pengindeksan yang betul bagi atribut dan entiti.
Cadangan Skema Hubungan
Skema pangkalan data hubungan berikut dicadangkan:
<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>
Menjejaki Data Sejarah
Skema ini membolehkan penjejakan data sejarah dengan menambahkan nilai atribut baharu dan memanfaatkan cap masa untuk mengenal pasti perubahan terkini. Ini mengelakkan keperluan untuk kemas kini data sambil mengekalkan sejarah lengkap pengubahsuaian.
Contoh Pertanyaan
Pertanyaan ilustrasi menunjukkan pengambilan data:
Pendapatan Jenis Entiti:
<code class="language-sql"> SELECT * FROM entity_type et LEFT JOIN entity e ON e.entity_type_id = et.id WHERE e.id = ?</code>
Pendapatan Atribut Entiti:
<code class="language-sql"> SELECT * FROM attr WHERE entity_id = ?</code>
Pendapatan Nilai Atribut (Nilai Tunggal dan Berbilang):
<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>
Pendapatan Perhubungan:
<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>
Cabaran dan Pertimbangan
Walaupun faedahnya, pendekatan ini memberikan beberapa cabaran:
Atas ialah kandungan terperinci Adakah Reka Bentuk Pangkalan Data EAV Penyelesaian yang Tepat untuk Pengurusan Data Sejarah yang Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!