उद्देश्य:आप किसी दिए गए निकाय से संबंधित विशेषता को संग्रहीत करना चाहते हैं।
मैं विशेषता मानों के लिए एक अलग तालिका की अनुशंसा नहीं करता जैसा कि हमने पिछले वर्षों में किया होगा। एक jsonb
लगाएं उपयुक्त टेबल पर दाईं ओर फ़ील्ड करें और इसे Attributes
कहें . एक GIN
जोड़ें इसे इंडेक्स करें ताकि आप मानों को जल्दी से क्वेरी कर सकें। या इसमें वर्णित अन्य तकनीकों का उपयोग करें।
इसे पढ़ें:https://dba.stackexchange.com/a/174421/7762
यहां सबसे बड़ा सवाल यह है कि क्या आप विशेषता मानों को पूर्व-परिभाषित करना चाहते हैं। यदि आप करते हैं, तो उन्हें स्टोर करने का एक अत्यंत कुशल तरीका है। यदि नहीं, तो मैं एक मानक JSON ऑब्जेक्ट की अनुशंसा करता हूं।
यदि आप अपनी विशेषताओं के नाम और मान पहले से परिभाषित कर सकते हैं:
यह आपको सबसे अधिक नियंत्रण, गति और फिर भी लचीलापन प्रदान करता है।
एक टेबल बनाएं Attribute
जिसमें ये फ़ील्ड हैं:
AttributeID int4 unsigned not null primary key
ParentAttributeID int4 unsigned null
Name varchar(64) not null
Deleted
बूल शून्य डिफ़ॉल्ट गलत नहीं हैParentAttributeID
पर एक इंडेक्स जोड़ेंAttributeID
को रोकने के लिए एक ट्रिगर जोड़ें बदलने से- डिलीट डू पर एक नियम जोड़ें इसके बजाय सेट करें Deleted=True
फिर किसी भी तालिका में आप विशेषता देना चाहते हैं, इस फ़ील्ड को जोड़ें:
AttributeSet" int[] not null default
- उस सरणी फ़ील्ड पर GIN अनुक्रमणिका जोड़ें
intarray
को भी सक्षम करें https://www.postgresql.org/docs/current/static से एक्सटेंशन /intarray.html
इससे क्या हासिल हुआ है?
आपने गुणों का एक वृक्ष बनाया है। यह ऐसा दिखाई दे सकता है:
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
मान लें कि आपके पास Items
नामक एक टेबल है और उस पर आपने AttributeSet
. जोड़ा है :
ItemID: 1234
Name: Tee Shirt
AttributeSet: [100, 103, 110, 112]
जब अनुवाद किया जाता है, तो इसका मतलब है कि इसमें Color=Green
. है विशेषता, और Size=Medium
विशेषता। 103
और 112
इसे स्टोर करने के लिए पर्याप्त थे, लेकिन कभी-कभी यह कहना अच्छा होता है कि "मुझे वे सभी आइटम दिखाएं जिनका कोई आकार परिभाषित है", इसलिए 110 को शामिल किया गया था।
आप इस बिजली को तेज़ और अत्यधिक लचीला बना सकते हैं।
SELECT
"ItemID", "Name"
FROM
"Items"
WHERE "AttributeMap" @> ARRAY[103,112]
Size=Medium
. वाले सभी आइटम वापस कर देंगे और Color=Green
या आप अन्य ऑपरेटरों का उपयोग https://www.postgresql पर कर सकते हैं .org/docs/10/static/functions-array.html कुछ शानदार प्रश्नों के साथ आने के लिए।
जब आप विशेषता मान नहीं जानते हैं लेकिन यह एक छोटा सा सेट है:
यह आपको सबसे अधिक गति, नियंत्रण और और भी अधिक लचीला प्रदान करता है। यदि आवश्यक हो, तो आप समीक्षा के लिए नई विशेषताओं को फ़्लैग कर सकते हैं।
आप उपरोक्त तकनीक का उपयोग कर सकते हैं और बस गतिशील रूप से Attribute
. में मान जोड़ सकते हैं तालिका यदि वे मौजूद नहीं हैं।
जब आप विशेषता मान नहीं जानते हैं और मान विविध हैं
यह आपको सबसे अधिक लचीलापन देता है, लेकिन नियंत्रण की कीमत पर।
इस मामले में इसे किसी भी तालिका में जोड़ें:
AttributeMap jsonb not null default '{}'::jsonb
- उस फ़ील्ड में GIN अनुक्रमणिका जोड़ें
अपने Attribute
. के विरुद्ध मानों को सत्यापित करने के लिए कोड लिखें मेज़। अगर यह सिंगल या मल्टी-वैल्यू है तो वहां एक इंडिकेटर लगाएं...
इस तरह AttributeMap
में स्टोर करें फ़ील्ड:
{
"Color": "Green",
"Size": "Medium",
"Categories": ["Sports", "Leisure"]
}
ध्यान दें कि श्रेणियाँ एक बहु-विशेषता है। आपके Attribute
. में तालिका में आपके पास एक फ़ील्ड होना चाहिए जो IsMulti bool not null
. है जो आपको यह जानने की अनुमति देगा कि इसके लिए कैसे पूछताछ करें।