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:
AttributeSet" int[] not null default
- Tambahkan indeks GIN pada bidang array itu
- Aktifkan juga
intarray
ekstensi dari https://www.postgresql.org/docs/current/static /intarray.html
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.