2011-03-15 15 views
5

EAV के बारे में मेरे प्रश्न से जारी है, मैं उत्पाद विशेषताओं को संग्रहीत करने के लिए मोंगोडीबी का उपयोग करने पर विचार कर रहा हूं।सिद्धांत ओडीएम और स्कीमा-कम डिज़ाइन

मैं इस ऐप के कैटलॉग भाग - श्रेणियों, उत्पादों और उनकी सभी संबंधित जानकारी - MongoDB (या कोई अन्य दस्तावेज़ डेटाबेस) के साथ स्टोर करूंगा।

मेरा प्रश्न है, ODM का उपयोग करते समय, प्रत्येक इकाई में एक स्कीमा है, जो अनिवार्य रूप से स्कीमा-कम लाभ को नोएसQL डेटाबेस का उपयोग करने की उपेक्षा करता है, है ना?

यदि यह सही है, तो कोई भी ओडीएम का उपयोग क्यों करेगा?

संपादित करें: मुझे related question मिला, क्या मैं हैश का उपयोग करके उत्पाद विशेषताओं की कार्यक्षमता प्राप्त कर सकता हूं?

उत्तर

5

समाधान एक @Hash

यहाँ एक बहुत ही बुनियादी उदाहरण मैं किया है उपयोग करने के लिए है:

<?php 

/** 
* @Document 
*/ 
class Product 
{ 

    /** 
    * @Id 
    */ 
    private $id; 

    /** 
    * @String 
    */ 
    private $name; 

    /** 
    * @Hash 
    */ 
    private $attributes = array(); 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function setName($name) 
    { 
     $this->name = $name; 
    } 

    public function getName() 
    { 
     return $this->name; 
    } 

    public function addAttribute($name, $value) 
    { 
     $key = preg_replace('/[^a-z0-9\ \_]/i', '', $name); 
     $key = preg_replace('/\s+/i', '_', $key); 
     $key = strtolower($key); 
     $this->attributes[$key] = array('value' =>$value, 'label' => $name); 
    } 

    public function getAttribute($name) 
    { 
     return $this->attributes[$name]; 
    } 

    public function getAttributes() 
    { 
     return $this->attributes; 
    } 

} 

कुछ डेटा जोड़ें:

<?php 

$pen = new Product(); 
$pen->setName('Cool Pen'); 
$pen->addAttribute('Weight', 12); 
$pen->addAttribute('Ink Colour', 'Red'); 
$pen->addAttribute('Colour', 'Black'); 

$tv = new Product(); 
$tv->setName('LED LCD TV'); 
$tv->addAttribute('Weight', 12550); 
$tv->addAttribute('Screen Size', 32); 
$tv->addAttribute('Colour', 'Black'); 

$dm->persist($pen); 
$dm->persist($tv); 

$dm->flush(); 

फिर क्वेरी, एक उत्पाद को खोजने रंग "काला" और 20 से अधिक स्क्रीन आकार के साथ:

<?php 

$query = $dm->createQueryBuilder('Catalogue\Product'); 
$products = $query->field('attributes.colour.value')->equals('Black') 
       ->field('attributes.screen_size.value')->gte(20) 
       ->getQuery()->execute(); 

मुझे अभी भी यकीन नहीं है कि यह करने का यह सबसे अच्छा तरीका है और मेरा शोध अभी भी चल रहा है।

1

हालांकि कुछ भी इसे लागू नहीं करता है, संग्रह के लिए मूल स्कीमा रखना एक अच्छा अभ्यास है। लगभग सभी ओडीएम आपको कक्षा में निर्दिष्ट फ़ील्ड जोड़ने की अनुमति नहीं देता है। मान लीजिए कि एप्लिकेशन इसे अनुमति देता है, आप फ़ील्ड मान भी छोड़ सकते हैं।

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

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

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

  • कोई संबंधित समस्या नहीं^_^