2009-11-19 5 views
5

मेरे पास 100,000 यूएसएस (नाम, आयु, लिंग, फोन, कंपनी, सड़क, शहर, राज्य, देश, ज़िप कोड, आदि) की एक तालिका है।एक MySQL तालिका का उपयोग कर नियमों का प्रतिनिधित्व कैसे करें?

मेरे पास उपयोगकर्ताओं के लिए हजारों प्रोमोशन की एक तालिका भी है। अब, प्रत्येक पदोन्नति के लिए मुझे एक नियम जोड़ने की आवश्यकता है जो परिभाषित करता है कि उपयोगकर्ताओं का कौन सा सबसेट लागू होता है।

उदाहरण के लिए, एक नियम हो सकता है: सभी उपयोगकर्ताओं जो 19999.

करने के लिए 10000 की एक ज़िपकोड एक और नियम हो सकता है है: सभी उपयोगकर्ताओं जो महिला हैं और नहीं अमेरिका

में अभी तक एक रहते तीसरा नियम हो सकता है: डीसी, एमडी या वीए में रहने वाले 18 वर्ष से अधिक आयु के उपयोगकर्ता। आदि आदि

अब एक विशिष्ट उपयोगकर्ता दिया गया है, मैं यह जानना चाहता हूं कि कुशलतापूर्वक! उस उपयोगकर्ता को कौन से प्रोमोशन लागू होते हैं।

इन नियमों को मॉडलिंग करने की एक अच्छी रणनीति क्या है, यह देखते हुए कि मैं एक विशिष्ट उपयोगकर्ता को मिलते-जुलते प्रचार को तुरंत ढूंढने में सक्षम होना चाहता हूं?

+0

को देखते हुए वहाँ आम सहमति है कि मैं चाहिए कि एसक्यूएल प्रश्नों के रूप में मेरे नियमों को स्टोर करें, क्या ऐसे प्रश्नों को पारस्परिक रूप से बनाने के लिए एक उपकरण है? मैं PHP/केकेपीएचपी/MySQL चला रहा हूँ। धन्यवाद! – Sleepster

उत्तर

2

यहां एक दृष्टिकोण है।

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

अब यह जटिल हो जाता है। प्रत्येक नियम वस्तु भी एक स्तर है। ऐसा इसलिए है कि आप एक और विरासत की आवश्यकता के रूप में और और तुलना कर सकते हैं। जिस तरह से मैंने पहले यह किया है वह यह भी है कि यहां तक ​​कि स्तर और विषम स्तर या। इसका मतलब है कि दो आइटम जो नियम के लिए सच होना चाहिए, दोनों स्तर 0 पर होंगे, यानी, उन्हें दोनों मान्य होना चाहिए। एक नियम के लिए जिसमें एक अनिवार्य शर्त है और दो और जहां सत्य हो सकते हैं, यानी 1 और (2 या 3), आप अनिवार्य नियम स्तर 0 पर और दूसरे दो स्तर 1 पर डालते हैं।

इसका लाभ दृष्टिकोण यह है कि SQL फ़िल्टर को इकट्ठा करने के लिए कोड घोंसले का अधिकार प्राप्त करता है क्योंकि इसे AND/OR मोड को सही करना होता है। यह नियमों के लिए एक संपादक बनाने के लिए भी संभव बनाता है।

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

+0

यह शानदार है। धन्यवाद! –

1

यह सामान्य रूप से डेटाबेस स्तर पर कुछ नहीं किया जाता है; इसके बजाय "नियम" का अर्थ आपके बैकएंड द्वारा किया जाएगा (जो भी भाषा आप उपयोग कर रहे हैं)। डेटाबेस में उन्हें कैसे संग्रहीत किया जाता है, इस पर निर्भर करता है कि उनका मॉडल कैसे किया जाता है। यह दृष्टिकोण उतना ही सरल या जटिल हो सकता है जितना कि इसे होना चाहिए - नियमों को आपके अंतिम उपयोगकर्ताओं, आदि द्वारा गतिशील रूप से परिभाषित किया जा सकता है ...

उस ने कहा, यदि आप त्वरित और गंदे की तलाश में हैं (विशाल के साथ गंदे पर जोर) समाधान, आप शायद अपने नियमों को वास्तविक प्रश्नों के रूप में संग्रहीत कर सकते हैं (या where प्रश्नों के लिए शर्तें)। फिर आप नियमों को लागू करने के लिए एक संग्रहीत प्रक्रियाओं को लिख सकते हैं।

2

मेरे लिए सीम्स आपके नियम वास्तव में कुछ भी हो सकते हैं और बेहतर प्रश्नों के द्वारा बेहतर प्रतिनिधित्व किया जा सकता है।

वे संग्रहित प्रक्रियाओं में मॉडल (MVC) या हो सकता है में जाना चाहिए। वास्तव में इस पर मेरा मन नहीं बना सकते हैं।

हर बार एक नया पदोन्नति शहर में आता है, सिस्टम सभी उपयोगकर्ताओं पर जाएगा और मैचों को उपयोगकर्ताओं और प्रचारों को जोड़ने वाली तालिका में स्टोर करेगा। यह हर नए उपयोगकर्ता पंजीकरण के लिए भी सच होगा। आप इसे एक cronjob में डालने पर भी विचार कर सकते हैं।

संपादित करें:
ध्यान दें कि तालिका है कि उपयोगकर्ताओं को प्रोन्नति सीधे लिंक महत्वपूर्ण है यदि आप वास्तव में प्रदर्शन के लिए देख रहे हैं

बस मेरे दो सेंट।

2

क्या होगा यदि आपने अपने नियमों को "SQL- like" रूप में संग्रहीत किया है? उदाहरण के लिए, आपके पास पहले से उल्लिखित एक यूएसईआर टेबल और प्रोमोशन टेबल है।

आप 2 नई टेबल, PROMOTION_RULE और PROMOTION_PROMOTION_RULE जोड़ सकते हैं। PROMOTION_RULE में नियम होंगे, और PROMOTION_PROMOTION_RULE किसी दिए गए प्रचार को इसके संबंधित नियम (ओं) से लिंक करेगा। यह डिज़ाइन आपको एकाधिक प्रचारों के लिए एक ही नियम साझा करने की अनुमति देता है।

PROMOTION_RULE में, आप एक स्तंभ RULE_SQL बुलाया संग्रहीत कर सकती है, और आप की तरह मान संग्रहीत कर सकते हैं:

(gender != 'F' and country != 'US')  
(age > 18 and state IN ('DC','MD','VA') 

आदि

फिर

आप ऐसे नियम हैं जो पदोन्नति के लिए आवेदन को देखने के कर सकता है, और गतिशील रूप से एक SQL कथन बनाएं जिसमें rule_sql मान शामिल होंगे।

2

यह इस बात पर निर्भर करता है कि कौन नियमों में प्रवेश कर रहा है और आपके लिए उनके विश्वास का स्तर कौन है। यदि यह सचमुच आप नियम जोड़ रहे हैं, तो आप डेटाबेस में SQL कथन के रूप में उन्हें स्टोर कर सकते हैं, लेकिन यह हैकी लगता है, या संग्रहित प्रक्रियाओं के रूप में, लेकिन मुझे यकीन नहीं है कि क्या आपके पास एक कॉलम हो सकता है जो संदर्भित करता है (यह हो सकता है निश्चित रूप से एक स्ट्रिंग कॉलम बनें)।

आप यह नहीं कहते कि आप किस प्रकार का ढांचा उपयोग कर रहे हैं, लेकिन यदि आप ओआरएम का उपयोग कर रहे हैं, तो आपके नियम क्वेरी ऑब्जेक्ट्स हो सकते हैं, जिन्हें डेटाबेस में बीएलओबी के रूप में क्रमबद्ध किया जा सकता है। उदाहरण के लिए, यदि आप पायथन के लिए स्क्लाक्लेमी का उपयोग कर रहे थे, तो प्रत्येक नियम क्वेरी का एक उदाहरण हो सकता है जिसे आप User.filter फ़ंक्शन पर भेज सकते हैं।

इन सभी मामलों में, आप मनमाने ढंग से कोड इंजेक्शन देने की अनुमति दे रहे हैं, इसलिए वे दूसरों को नियम जोड़ने की अनुमति देने के लिए उपयुक्त नहीं हैं। केवल अच्छा समाधान नियमों को व्यक्त करने के लिए सीमित डोमेन-विशिष्ट भाषा बनाना होगा, और उन्हें SQL या आपकी ORM भाषा में परिवर्तित करना होगा।

+0

हां, मैं नियम जोड़ रहा हूं। मैं देखता हूं कि आप "नियम भाषा"-से-क्वेरी रूपांतरण के संबंध में क्या कह रहे हैं। ऐसे नियमों को परिभाषित करने और एसक्यूएल प्रश्नों में परिवर्तित करने के लिए उपकरणों पर कोई सुराग? – Sleepster

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