PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mencari struktur EAV yang tepat berdasarkan jsonb

Tujuan:Anda ingin menyimpan atribut yang terkait dengan entitas tertentu.

Saya tidak merekomendasikan tabel terpisah untuk nilai atribut seperti yang mungkin telah kita lakukan di tahun-tahun sebelumnya. Letakkan jsonb bidang tepat di tabel yang sesuai dan beri nama Attributes . Tambahkan GIN indeks untuk itu sehingga Anda dapat menanyakan nilai-nilai dengan cepat. Atau gunakan teknik lain yang dijelaskan di dalamnya.

Baca ini:https://dba.stackexchange.com/a/174421/7762

Pertanyaan terbesar di sini adalah apakah Anda berniat untuk menentukan nilai atribut terlebih dahulu. Jika ya, ada cara yang sangat efisien untuk menyimpannya. Jika tidak, maka saya merekomendasikan objek JSON standar.

Jika Anda dapat menentukan nama DAN nilai atribut sebelumnya:

Ini memberi Anda kontrol, kecepatan, dan tetap memberikan fleksibilitas.

Buat tabel Attribute yang memiliki bidang ini:

  • AttributeID int4 unsigned not null primary key
  • ParentAttributeID int4 unsigned null
  • Name varchar(64) not null
  • Deleted bool bukan nol default salah
  • Tambahkan indeks pada ParentAttributeID
  • Tambahkan pemicu untuk mencegah AttributeID dari perubahan
  • Tambahkan aturan pada penghapusan lakukan alih-alih setel Deleted=True

Kemudian di tabel mana pun yang ingin Anda atribusikan, tambahkan bidang ini:

Apa yang telah dicapai ini?

Anda telah membuat pohon atribut. Mungkin terlihat seperti ini:

ID   Parent  Name
----------------------------
100  NULL    Color
101  100       Blue
102  100       Red
103  100       Green
110  NULL    Size
111  110       Large
112  110       Medium 
113  110       Small

Katakanlah Anda memiliki tabel bernama Items dan di atasnya Anda telah menambahkan AttributeSet :

      ItemID: 1234
        Name: Tee Shirt
AttributeSet: [100, 103, 110, 112]

Saat diterjemahkan, ini berarti memiliki Color=Green atribut, dan Size=Medium atribut. 103 dan 112 cukup untuk menyimpannya, tetapi terkadang menyenangkan untuk dapat mengatakan "Tunjukkan semua item yang memiliki Ukuran yang ditentukan", itu sebabnya 110 disertakan.

Anda dapat membuat ini secepat kilat dan sangat fleksibel.

SELECT
  "ItemID", "Name"
FROM
  "Items"
WHERE "AttributeMap" @> ARRAY[103,112]

Akan mengembalikan semua item yang memiliki Size=Medium dan Color=Green

Atau Anda dapat menggunakan operator lain di https://www.postgresql .org/docs/10/static/functions-array.html untuk mengajukan beberapa pertanyaan menarik.

Bila Anda tidak mengetahui nilai atribut tetapi nilainya kecil:

Ini memberi Anda kecepatan, kontrol, dan bahkan lebih fleksibel. Anda dapat menandai atribut baru untuk ditinjau jika diperlukan.

Anda dapat menggunakan teknik di atas dan hanya menambahkan nilai secara dinamis ke Attribute tabel jika tidak ada.

Bila Anda tidak mengetahui nilai atribut dan nilainya beragam

Ini memberi Anda fleksibilitas tertinggi, tetapi dengan mengorbankan kontrol.

Dalam hal ini tambahkan saja ini ke tabel apa pun:

  • AttributeMap jsonb not null default '{}'::jsonb
  • Tambahkan indeks GIN ke bidang itu

Tulis kode untuk memvalidasi nilai terhadap Attribute Anda meja. Memiliki indikator di sana apakah itu satu atau multi-nilai...

Simpan seperti ini di AttributeMap bidang:

{
    "Color": "Green", 
    "Size": "Medium", 
    "Categories": ["Sports", "Leisure"]
}

Perhatikan bahwa Kategori adalah multi-atribut. Di Attribute . Anda tabel Anda harus memiliki bidang yang IsMulti bool not null yang memungkinkan Anda mengetahui cara menanyakannya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nilai maksimum baris (dari n kolom) - Pendekatan elegan

  2. Rails 3.1:Meminta Postgres untuk catatan dalam rentang waktu

  3. Tugas menyapu tampaknya mengabaikan konfigurasi database.yml

  4. psycopg2.ProgrammingError pada tipe Enum dalam migrasi database Flask (database)

  5. Bagaimana cara membuat perintah salin terus berjalan di pergeseran merah bahkan setelah fungsi lambda yang memulainya telah habis?