2009-09-18 8 views
15

में गुणों की गतिशील संख्या वाले डेटा को कैसे संग्रहीत करें मेरे पास अलग-अलग गुणों के साथ कई अलग-अलग ऑब्जेक्ट्स हैं। अब तक मैंने XML फ़ाइलों में डेटा सहेजा है जो आसानी से गुणों की एक सतत संख्या की अनुमति देता है। लेकिन मैं इसे डेटाबेस में ले जाने की कोशिश कर रहा हूं।डेटाबेस

इस डेटा को स्टोर करने का आपका पसंदीदा तरीका क्या होगा?

कुछ रणनीतियों मैं अब तक पहचान की है:

  • होने एक ही नामित क्षेत्र "विशेषता" वस्तु की तालिका में और डेटा धारावाहिक या वहाँ में json'ed की दुकान।
  • डेटा को दो तालिकाओं (वस्तुओं, विशेषताओं) में संग्रहित करना और संबंधों को बचाने के लिए तीसरे का उपयोग करना, इसे एक वास्तविक n: m संबंध बनाना। बहुत साफ समाधान, लेकिन संभवतः एक संपूर्ण वस्तु और उसके सभी गुणों को लाने के लिए बहुत महंगा है
  • गुणों की पहचान करना सभी वस्तुओं में समान है और इनके लिए ऑब्जेक्ट की तालिका में फ़ील्ड बनाना है। शेष गुणों को दूसरे क्षेत्र में क्रमबद्ध डेटा के रूप में स्टोर करें। खोजों को आसान बनाने, पहली रणनीति पर इसका लाभ है।

कोई विचार?

+0

डीबी समाधान में जाने के लिए प्रेरणा क्या है? आपने नीचे कहा, वह गति आपकी मुख्य चिंता है। क्या आपको लगता है कि एक डीबी समाधान आपके वर्तमान एक्सएमएल दृष्टिकोण से तेज़ होगा? –

+0

DVK के साथ एक चौथी रणनीति को ध्यान में रखकर आया: ऑब्जेक्ट टेबल में सामान्य विशेषताओं को संग्रहित करना और 1: n संबंध दूसरे स्थान का उपयोग करके अन्य सभी को संग्रहित करना। गति, लचीलापन और साफ समाधान (@Tobiask) –

+0

@Corey के लिए सबसे अच्छा समझौता लगता है, नहीं, मैं नहीं करता। इस समय एक्सएमएल समाधान अविश्वसनीय तेज़ है और मुझे नहीं लगता कि एक डीबी इसके साथ रह सकता है। स्टोरेज विकल्पों के संबंध में सिस्टम को और अधिक लचीला बनाने की कोशिश कर रहा है और साथ ही साथ मेरे MySQL कौशल में सुधार करने के लिए यह एक अभ्यास है। –

उत्तर

18

अद्यतन नहीं कर सकते तो आप विशिष्ट attribtes के लिए खोज पर कभी योजना है, यह करने के लिए एक बुरा विचार है, तो आप विशेषताओं द्वारा फ़िल्टर नहीं कर सकते -

Sstuffing> 1 एक ही ब्लॉब में विशेषता नहीं की सिफारिश की है उन्हें एक कॉलम में क्रमबद्ध करें, क्योंकि आपको जानकारी प्राप्त करने के लिए प्रति पंक्ति कार्यों का उपयोग करना होगा - यह कभी भी स्केल नहीं करता है।

मैं आपकी दूसरी पसंद का चयन करूंगा। एक विशेषता तालिका में विशेषताओं की एक सूची, अपनी तालिका में ऑब्जेक्ट्स, और ऑब्जेक्ट विशेषताओं नामक कई से अधिक रिलेशनशिप तालिकाएं हैं।

उदाहरण के लिए:

objects: 
    object_id integer 
    object_name varchar(20) 
    primary key (object_id) 
attributes: 
    attr_id  integer 
    attr_name varchar(20) 
    primary key (attr_id) 
object_attributes: 
    object_id integer references (objects.object_id) 
    attr_id  integer references (attributes.attr_id) 
    primary key (object_id,attr_id) 

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

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

उन ट्रिगर्स का उपयोग करके, आप केवल तभी आवश्यक कार्य को कम करते हैं जब डेटा बदलता है। सब-कॉलम जानकारी निकालने का प्रयास करके, आप प्रत्येक चयन पर अनावश्यक काम करते हैं।

+0

पहली रणनीति के साथ बिल्कुल मेरी चिंता। –

+0

प्रश्न यह है कि प्रदर्शन के लिए यह बेहतर है कि आपकी विधि क्या है, जेसन मॉडलिंग डेटा को संग्रहीत करने के बारे में आपकी राय क्या है –

+0

@babakfaghihian, मुझे लगता है कि मैं इसे अपने अंतिम दो पैराग्राफ में कवर करता हूं, हां? प्रदर्शन के लिए 3 एनएफ तोड़ना ठीक है बशर्ते आप जोखिमों को समझें और कम करें (आंकड़ों के तत्व "एक दूसरे के साथ असहमत")। मूल डेटा (एक्सएमएल, जेएसओएन या जो कुछ भी) संग्रहीत करना इस के लिए एक दृष्टिकोण है। – paxdiablo

1

लगता है जैसे आपको कुछ चाटना couchdb, आरडीबीएमएस नहीं चाहिए।

टी 1:

+0

यह एक आदर्श समाधान की तरह लगता है। दुर्भाग्य से मैं ज्यादातर परिदृश्यों से निपट रहा हूं जहां मेरे पास MySQL से बहुत अधिक उपयोग करने की संभावना नहीं है, सर्वर पर एक और डीबी स्थापित करने दें। –

6

अपने 2 डी समाधान पर एक बदलाव सिर्फ दो तालिकाओं (यह मानते हुए सभी विशेषताओं एक ही प्रकार के कर रहे हैं) है | ऑब्जेक्ट डेटा स्तंभ | object_id |

टी 2: | ऑब्जेक्ट आईडी | attribute_name | विशेषता मूल्य | (पहले 2 कॉलम पर अद्वितीय अनुक्रमणिका)

यह तीसरा समाधान, उदाहरण के साथ संयुक्त होने पर और भी अधिक कुशल है। सभी सामान्य क्षेत्र टी 1 में जाते हैं। आप कुशलतापूर्वक उन्हें

+0

वास्तव में, यह मेरी तीन रणनीतियों को फिर से पढ़ने के बाद मेरे दिमाग में आया था। जाने का सबसे अच्छा तरीका लगता है। –

+1

हाय। इसे एंटिटी-एट्रिब्यूट-वैल्यू टेबल कहा जाता है, और यह खराब डिज़ाइन है http://programmers.stackexchange.com/questions/93124/eav-is-it-really-bad-in-all-scenarios –

+0

@ गैबरीबोथा - लिंक किए गए प्रश्नों के उत्तर किसी भी तरह से आपके फ्लैट और अवांछित दावे का समर्थन नहीं करते हैं कि यह एक "खराब" डिज़ाइन है। यह विशिष्ट त्रुटियों वाला एक डिज़ाइन है - जैसे सभी डिज़ाइन - और विशिष्ट स्थितियां हैं जहां यह सबसे अच्छा तरीका है। – DVK

1

यदि आप बाद के बिंदुओं में विशेषताओं को संपादित/कुशल/हटाने के लिए जा रहे हैं, तो एक वास्तविक n: m (दूसरा विकल्प) एक ऐसा होगा जो मैं जाता हूं। (या इसे 2 टेबल बनाने का प्रयास करें जहां एक ही विशेषता दोहराती है। लेकिन डेटा का आकार ऊंचा होगा)

यदि आप विशेषताओं से निपट नहीं रहे हैं (केवल डेटा को कैप्चरिंग और दिखा रहे हैं) तो आप आगे बढ़ सकते हैं और एक फ़ील्ड में स्टोर कर सकते हैं कुछ विभाजक के साथ (सुनिश्चित करें कि विभाजक विशेषता मान में नहीं होगा)

1

यदि आप एक रिलेशनल डीबी का उपयोग कर रहे हैं, तो मुझे लगता है कि आपने विकल्प सूचीबद्ध करने के लिए एक अच्छी नौकरी की है। उनमें से प्रत्येक के पास उनके पेशेवर और विपक्ष हैं। आप यह तय करने के लिए सबसे अच्छी स्थिति में हैं कि आपकी परिस्थितियों के लिए सबसे अच्छा क्या काम करता है।

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

संपादित करें - अपनी टिप्पणियों को और पढ़ें, यदि आप अपनी मुख्य चिंता करते हैं तो आप डीबी पर क्यों स्विच कर रहे हैं। आपके वर्तमान एक्सएमएल कार्यान्वयन के बारे में क्या बात है?

2

मैं this scheme लागू करने के लिए प्रयोग किया है:

t_class (id RAW(16), parent RAW(16)) -- holds class hierachy. 
t_property (class RAW(16), property VARCHAR) -- holds class members. 
t_declaration (id RAW(16), class RAW(16)) -- hold GUIDs and types of all class instances 
t_instance (id RAW(16), class RAW(16), property VARCHAR2(100), textvalue VARCHAR2(200), intvalue INT, doublevalue DOUBLE, datevalue DATE) -- holds 'common' properties 

t_class1 (id RAW(16), amount DOUBLE, source RAW(16), destination RAW(16)) -- holds 'fast' properties for class1. 
t_class2 (id RAW(16), comment VARCHAR2(200)) -- holds 'fast' properties for class2 
--- etc. 

RAW(16) वह जगह है जहाँ Oracle रखती GUID रों

आप एक वस्तु के लिए सभी गुण का चयन करना चाहते हैं, तो आप जारी करते हैं:

SELECT i.* 
FROM (
     SELECT id 
     FROM t_class 
     START WITH 
       id = (SELECT class FROM t_declaration WHERE id = :object_id) 
     CONNECT BY 
       parent = PRIOR id 
     ) c 
JOIN property p 
ON  p.class = c.id 
LEFT JOIN 
     t_instance i 
ON  i.id = :object_id 
     AND i.class = p.class 
     AND i.property = p.property 

t_property जिन सामानों को आप सामान्य रूप से खोज नहीं करते हैं उन्हें पकड़ें (जैसे, टेक्स्ट विवरण इत्यादि)

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

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

+1

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

+1

'@ जोर्ग ': यह' ओरेकल 'में था और यह' ओरेकल 'वाक्यविन्यास है। 'MySQL' में, आपको इस फ़ंक्शन को किसी अन्य तरीके से कार्यान्वित करने की आवश्यकता होगी: http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/ – Quassnoi

+0

आपको केवल " तेज़ गुण ": जब आपको दो या दो से अधिक गुणों पर एक समग्र अनुक्रमणिका बनाने की आवश्यकता होती है। अन्यथा, आपके पास केवल '4' मूल सारणी हो सकती है। – Quassnoi

3

मुझे DVK क्या कह रहा था के बारे में कुछ समझदारी दें।

मान लिया जाये कि मान तालिका कैसा दिखेगा एक ही प्रकार के कर रहे हैं (अच्छी किस्मत, मुझे लगता है कि आप इसे जरूरत के लिए जा रहे):

 
dynamic_attribute_table 
------------------------ 
id   NUMBER 
key  VARCHAR 
value  SOMETYPE? 

उदाहरण (कार):

 
|id| key | value | 
--------------------------- 
| 1|'Make' |'Ford'  | 
| 1|'Model' |'Edge'  | 
| 1|'Color' |'Blue'  | 
| 2|'Make' |'Chevrolet'| 
| 2|'Model' |'Malibu' | 
| 2|'MaxSpeed'|'110mph' | 

इस प्रकार ,
इकाई 1 = {('मेक', 'फोर्ड'), ('मॉडल', 'एज'), ('रंग', 'ब्लू'),
और,
इकाई 2 = {('मेक ',' शेवरलेट '), (' मॉडल ',' मालिबू '), (' मैक्सस्पेड ',' 110 एमएफ ')}।

+0

क्या होगा यदि आप कहना चाहते हैं कि मशीन में काला रंग और पीला रंग है? –