2010-09-17 15 views
6

मैं डेटाबेस में डुप्लिकेट ग्राहक विवरण खोजने के लिए कुछ कोड लिख रहा हूं। मैं लेवेनशेटिन दूरी का उपयोग करूँगा।बिडरेक्शनल रिश्तों को कैसे स्टोर करें

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

मुझे भ्रमित करता है कि संबंधों की द्विपक्षीय प्रकृति को कैसे स्टोर किया जाए।

मैं नीचे कुछ उदाहरण डाल करने के लिए शुरू कर दिया है, लेकिन आश्चर्य अगर वहाँ डेटा के इस प्रकार के भंडारण के लिए सबसे अच्छा अभ्यास है,

उदाहरण डेटा

आईडी, पता

001, 5 मुख्य सड़क
002, 5 मेन स्ट्रीट
003, 5 मुख्य Str
004, 6 हाई स्ट्रीट
005, 7 कम स्ट्रीट
006, 7 कम सेंट

सुझाव 1

customer_id1, customer_id2, relationship_strength
001, 002, 0.74
001, 003, 0.77
002, 003, 0.76
005, 006, 0,77

के रूप में यह एक तरह से ग्राहक के बीच एक एक तरह से संबंध infers इस दृष्टिकोण के साथ खुश नहीं omer_id1 ग्राहक_id2 पर। बेशक जब तक मैं सभी रिश्तों को दोनों तरीकों से शामिल नहीं करता, लेकिन यह प्रसंस्करण समय और तालिकाओं के आकार की मात्रा को दोगुना कर देगा।

जैसे शामिल करने के लिए की आवश्यकता होगी: 0.74

सुझाव 002, 001, 2

CUSTOMER_ID,
001, 1
002, 1
003, 1
005, 2 grouping_id
006, 2

उत्तर

6

हमारे पास यहां एक ग्राफ है जिसमें प्रत्येक नोड के पास हर दूसरे नोड के साथ संबंध (संपादन दूरी) होता है। यह डेटा मॉडल की सामान्य सीमा में नहीं है। यह भी अपने डेटाबेस की एक स्थायी सुविधा नहीं है (यदि आप व्यवसाय प्रक्रियाओं जो डुप्लिकेट डेटा के लिए नेतृत्व को हल कल्पना करते हुए) तो यह समाधान जो सबसे अच्छा संबंधपरक सिद्धांत फिट बैठता है से अधिक पसीना के लायक नहीं है। हमें एक व्यावहारिक समाधान की जरूरत है।

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

  addr 
      1 2  3 4  5 
addr 
    1  - 95 95 80 76 
    2  - - 100 75 72 
    3  - -  - 75 72 
    4  - -  - - 83 
    5  - -  - -  - 

इस डेटा के लिए सबसे अच्छा, सुझाव 1 में संग्रहित किया जा सकता ID1, ID2, SCORE की तालिका। यद्यपि हमें उस तरह के आउटपुट को देखने के लिए डेटा को पिवोट करने की आवश्यकता है :)

उचित लीग तालिका में स्कोर के दो सेट हैं - घर और दूर - इसलिए तालिका सममित है। लेकिन यह यहां लागू नहीं होता है, क्योंकि 1 > 2 के लिए संपादन दूरी 2 > 1 के समान है। हालांकि, परिणाम परिणामों में प्रतिबिंबित स्कोर शामिल होने पर यह परिणाम अधिक सरलता से पूछताछ करेगा। यही है, रिकॉर्ड (1,5,76), (2,5,72), आदि के लिए हम रिकॉर्ड (5,1,76), (5,2,72) उत्पन्न करते हैं। यह स्कोरिंग प्रक्रिया के अंत में किया जा सकता है।

  addr 
      1 2  3 4  5 
addr 
    1  - 95 95 80 76 
    2  95 - 100 75 72 
    3  95 100  - 75 72 
    4  80 75 75 - 83 
    5  76 72 72 83  - 
बेशक

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

select case when id1 = 5 then id1 else id2 end as id1 
     , case when id1 = 5 then id2 else id1 end as id2 
     , score 
from your_table 
where id1 = 5 
or  id2 = 5 
/
+0

धन्यवाद एपीसी। वह मैट्रिक्स समझ में आता है और इसे देखने में मदद करता है। वह एसक्यूएल कथन वास्तव में भी हाथ है। धन्यवाद। – alj

1

हमेशा के रूप में यह गणना करने के बाद डेटा के साथ आप क्या करना चाहते हैं इस पर निर्भर करता है।

मान लिया जाये कि यह पहचान करने या डुप्लिकेट का पता लगाने की बस है तो अपने सुझाव 1 मैं क्या उपयोग करना चाहते हैं, यानि कि एक दूसरी तालिका कि बस जोड़े और शक्तियों को संग्रहीत करता है। मेरा एकमात्र सुझाव है कि शक्तियों को दशमलव के बजाय एक स्केल किए गए पूर्णांक को बनाना है।

+0

मुझे डेटा को उन लोगों को वापस पेश करने की आवश्यकता है जो इसे बनाए रखते हैं ताकि वे जा सकें और इसे देख सकें। तो उस सम्मान में मेरा पहला सुझाव पर्याप्त होगा। लेकिन मैं जानना चाहता था कि ऐसी जानकारी संग्रहीत करने का 'मानक' तरीका था, इसलिए मैं इसे जो कुछ भी चाहता था उसके आधार पर विभिन्न स्वरूपों में आउटपुट करने के लिए लचीलापन प्राप्त कर सकता था (क्योंकि उन्हें कोई संदेह नहीं होगा कि वे यह चाहते हैं कि वे एक और तरीका करें!)। भी ... डेटाबेस स्कीमा की मेरी समझ में सुधार करने के लिए यह एक अच्छा अवसर है। – alj

+0

... और धन्यवाद रिचर्ड। – alj

+0

यह वही तरीका है जो मैंने हमेशा किया है। कभी-कभी सबसे सरल समाधान बस काम करता है और हमें कुछ और जटिल नहीं ढूंढना चाहिए। पहला समाधान काम करेगा और पर्याप्त रूप से कुशल होगा और आपको आवश्यक परिणामों का उत्पादन करेगा। –

6

तरह से एक संबंधपरक प्रणाली में सममित संबंधों से निपटने के लिए है: हम अभी भी एक सरल एसक्यूएल बयान का इस्तेमाल स्कोर miiroring बिना के लिए, मान लें एक पठनीय फैशन में पता 5 सभी स्कोर प्राप्त कर सकते हैं

  • एक कैनोलिक रूप चुनें जिसमें सममित जोड़े संग्रहीत किए जाते हैं, उदाहरण के लिए ग्राहक_आईडी 1 < ग्राहक_आईडी 2।
  • एक दृश्य SYMM_TBL चयन के रूप में ID1 आईडी 2 ... से ... ID1 आईडी 2 के रूप में ID1, ... से के रूप में संघ का चयन आईडी 2 निर्धारित करें ...

सभ्य प्रणालियों में सज़ा नहीं चाहिए इस दृश्य से पूछताछ करते समय प्रदर्शन क्षेत्र।

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