2008-11-04 14 views
15

क्या आप अभिव्यक्तियों के अनंत घोंसले की अनुमति देते हुए डेटाबेस में बूलियन अभिव्यक्तियों को व्यवस्थित करने का कोई तरीका जानते हैं?बूलियन अभिव्यक्तियों के लिए डेटा मॉडल

उदाहरण:

a = 1 AND (b = 1 OR b = 2) 

एक पूरे के रूप अभिव्यक्ति डेटा अखंडता की रक्षा करने के लिए varchar के रूप में जमा नहीं किया जाना चाहिए।

+0

स्पष्ट कृपया =: आप अभिव्यक्ति के परिणाम को स्टोर करना चाहते हैं या देशी डीबी कॉलम प्रकारों से अभिव्यक्ति का पुनर्निर्माण करने में सक्षम होना चाहते हैं? –

+0

मुझे अभिव्यक्ति का पुनर्निर्माण करना पसंद है। –

+0

क्या कोई आवश्यकता है कि डेटाबेस SQL ​​/ relational हो? क्या आप ओओडीबीएमएस का उपयोग कर सकते हैं? – Oddthinking

उत्तर

8

एक अभिव्यक्ति एक ट्रेलीइक संरचना है। तो आपको एक टेबल में पेड़ पेश करने का एक तरीका चाहिए।

  • आईडी
  • TypeExpression (और, या आदि ...)
  • FirstChildID

SecondChildID इस मामले में,:

उदाहरण के लिए क्षेत्रों का उपयोग कर सकते आपके पास निम्न प्रकार हैं:

  1. और, बच्चे अन्य अभिव्यक्ति को इंगित करते हैं।
  2. या, बच्चे अन्य अभिव्यक्ति को इंगित करते हैं।
  3. समान, बच्चे अन्य अभिव्यक्ति को इंगित करते हैं।
  4. शाब्दिक, फर्स्ट चाइल्ड एक शाब्दिक तालिका में प्रवेश के लिए इंगित करता है।
  5. वेरिएबल लुकअप, फर्स्ट चाइल्ड एक परिवर्तनीय तालिका में एक प्रविष्टि को इंगित करता है।

लेकिन मुझे लगता है कि अभिव्यक्ति को व्यवस्थित करने के बेहतर तरीके हैं। मैंने एक बार एक साधारण अभिव्यक्ति मूल्यांकनकर्ता बनाया जो एक स्ट्रिंग स्वीकार करता है और एक संख्यात्मक परिणाम उत्पन्न करता है।

13

विकल्प 1 एक नेस्टेड टेबल (आईडी/parent_id संरचना वाला पेड़) का उपयोग करना होगा, जैसे गेमकैट सुझाया गया है। यह अपेक्षाकृत महंगा है, और एक नेस्टेड अभिव्यक्ति के बराबर बनाने के लिए दोबारा SQL क्वेरी जारी करने की आवश्यकता है।

विकल्प 2 एक धारावाहिक वस्तु का उपयोग करना होगा और इसे एक वर्चर कॉलम में स्टोर करना होगा। उदाहरण के लिए, जेएसओएन एक अच्छा विकल्प होगा। यह सफेद-स्थान संवेदनशील नहीं है, इसे बड़ी संख्या में भाषाओं में बनाया और पार्स किया जा सकता है, और यह डेटा अखंडता को बरकरार रखता है।

जैसे ही आपने अपनी अभिव्यक्ति स्ट्रिंग को स्मृति में पेड़ ऑब्जेक्ट में पार्स किया है, तो आप इसे क्रमबद्ध कर सकते हैं और इसे स्टोर कर सकते हैं। यदि डेटाबेस स्तर पर अभिव्यक्ति में हेरफेर करने की कोई आवश्यकता नहीं है, तो मुझे लगता है कि मैं उस मार्ग पर जाऊंगा।

+1

आप यहां एक बहुत अच्छी बात कर रहे हैं: किसी को विकल्प 1 का उपयोग नहीं करना चाहिए क्योंकि इसका उपयोग किया जा सकता है; विकल्प 1 को औचित्य देने के लिए कुछ निश्चित आवश्यकताएं होनी चाहिए। यदि ऐसी आवश्यकताएं आसन्न नहीं हैं, तो शायद मैं विकल्प 2 से शुरू करूंगा। – Yarik

1

यह संबंधपरक रूप से प्रतिनिधित्व करना मुश्किल होगा, क्योंकि इसकी प्रकृति से यह पदानुक्रमिक और बहुरूप है (आपके पेड़ की पत्तियां या तो चर या स्थिरांक हो सकती हैं)।

2

इस प्रकार की अभिव्यक्ति आमतौर पर एक पेड़ (एक पदानुक्रम) के रूप में व्यक्त की जाती है, जो एसक्यूएल में क्वेरी करने के लिए कुख्यात रूप से परेशान होती है।

हम मानेंगे कि a और b इस पल के लिए संख्यात्मक हैं और शाब्दिक ('1', '2') चर से अलग हैं।

Table Nodes 
id 
type (Variable|Literal) 
name (nullable for literal) 
value 

Table Operators 
id 
name (=, AND, OR, NOT) 
leftNodeId 
rightNodeId 

इस संरचना बहुत लचीला है, लेकिन यह क्वेरी करने के लिए एक जटिल अभिव्यक्ति को पुनः प्राप्त करने (पढ़ा है कि "चुनौतीपूर्ण") "मजा" होने जा रहा है।

और आपको अभी भी पुनर्निर्माण के बाद अभिव्यक्ति के साथ शुरू करने और मूल्यांकन करने के लिए संरचना का विश्लेषण करना होगा।

2

बुलीयन कार्यों का मॉडल करने का पारंपरिक तरीका Binary Decision Diagrams, विशेष रूप से कम ऑर्डर बाइनरी निर्णय आरेखों का उपयोग करना है। यह संभव है कि आप अपने डीबीएमएस के लिए एक एक्सटेंशन पा सकें जो अवधारणा के लिए अच्छा समर्थन प्रदान करता है।

अद्यतन: वैकल्पिक रूप से, यदि आपको बूलियन तर्क पर पूछताछ करने की आवश्यकता नहीं है, तो आप बीडीडी लाइब्रेरी का उपयोग कर सकते हैं और बस बीडीडी को BLOB या समकक्ष में क्रमबद्ध कर सकते हैं। यह varchar फ़ील्ड का उपयोग करके धड़कता है क्योंकि बीडीडी लाइब्रेरी सुनिश्चित करेगा कि डेटा मान्य था।

0

@Gamechat जवाब

मुझे लगता है कि इस

आईडी की तरह होना चाहिए

TypeExpression को जोड़ना (और, या आदि ...)

FirstChildID --This एक हो सकता है पत्ती नोड या एक ही पंक्ति में एक पॉइंटर एक ही पंक्ति में

सेकेंड चाइल्डआईडी - यह एक ही पत्ता में एक पत्ता नोड या एक पॉइंटर हो सकता है

isFirstChildLeaf

isSecondChildLeaf

2

मैं, पॉलिश रूप में अभिव्यक्ति की दुकान हैं एक varchar/पाठ स्तंभ में। पॉलिश फॉर्म में एक अभिव्यक्ति (ऑपरेंड से पहले ऑपरेंड, कोई ब्रैकेट) एक रिकर्सिव फ़ंक्शन (या पाठ्यक्रम का ढेर) के साथ पार्स करना बहुत आसान है।

एक = 1 और (ख = 1 या ख = 2)

पॉलिश के रूप में इस तरह दिखाता है:

और एक 1 या = b 1 = ख 2

संबंधित मुद्दे