PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Jsonb . पर आधारित एक सही EAV संरचना की तलाश है

उद्देश्य:आप किसी दिए गए निकाय से संबंधित विशेषता को संग्रहीत करना चाहते हैं।

मैं विशेषता मानों के लिए एक अलग तालिका की अनुशंसा नहीं करता जैसा कि हमने पिछले वर्षों में किया होगा। एक 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

फिर किसी भी तालिका में आप विशेषता देना चाहते हैं, इस फ़ील्ड को जोड़ें:

इससे क्या हासिल हुआ है?

आपने गुणों का एक वृक्ष बनाया है। यह ऐसा दिखाई दे सकता है:

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 . है जो आपको यह जानने की अनुमति देगा कि इसके लिए कैसे पूछताछ करें।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Psql में बहु-पंक्ति स्ट्रिंग को परिभाषित करना

  2. एक ही मशीन पर कई पोस्टग्रेज इंस्टेंस बनाएं

  3. PostgreSQL तार्किक प्रतिकृति का अनुकूलन कैसे करें

  4. PostgreSQL में डेटाबेस को सूचीबद्ध करना और स्विच करना

  5. पोस्टग्रेएसक्यूएल pg_trgm धीमे का उपयोग करके फिर पूर्ण स्कैन