बूलियन अभिव्यक्तियों के लिए डेटा मॉडल

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

उदाहरण:

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

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

0
क्या कोई आवश्यकता है कि डेटाबेस एसक्यूएल/रिलेशनल हो? क्या आप ओओडीबीएमएस का उपयोग कर सकते हैं?
जोड़ा लेखक Oddthinking, स्रोत
कृपया स्पष्ट करें: आप अभिव्यक्ति के परिणाम को संग्रहीत करना चाहते हैं या देशी डीबी कॉलम प्रकारों से अभिव्यक्ति का पुनर्निर्माण करने में सक्षम होना चाहते हैं?
जोड़ा लेखक Ken Gentle, स्रोत

7 उत्तर

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

0
जोड़ा

@Gamechat उत्तर में जोड़ना

मुझे लगता है कि यह इस तरह होना चाहिए

आईडी

टाइपएक्सप्रेस (और, या आदि ...)

FirstChildआईडी--This can be a leaf node or a pointer to another row in same table

SecondChildआईडी--This can be a leaf node or a pointer to another row in same table

isFirstChildLeaf

isSecondChildLeaf

0
जोड़ा

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

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

0
जोड़ा

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

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

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

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

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

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

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

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

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

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

0
जोड़ा

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

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

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

इस मामले में, आपके पास निम्न प्रकार हैं:

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

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

0
जोड़ा

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

ए = 1 और (बी = 1 या बी = 2)

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

और = एक 1 या = बी 1 = बी 2

0
जोड़ा