2009-09-04 6 views
11

पर एक से अधिक कुंजी बनाम कुंजी की सूचीप्रॉपर्टी एक काल्पनिक उदाहरण के रूप में, मेरे पास एक मॉडल टोडोइटम और मॉडल टोडोलिस्ट है। एक TodoList के पास TodoItems की एक आदेशित सूची है, और कोई भी TodoItem किसी भी संख्या में TodoLists (कई से कई) से संबंधित हो सकता है। TodoList में TodoItem के आदेश के अलावा अन्य संबंधों को उनके संबंधों के बारे में संग्रहीत करने की आवश्यकता नहीं है। डेटा स्टोर में इसका प्रतिनिधित्व करने का सबसे अच्छा तरीका क्या है?ऐप इंजन

इस लागू करने के लिए दो तरीके हैं - TodoList वर्ग db.Key के एक ListProperty जो TodoItem के लिए संदर्भित करेंगे दे:

class TodoList(db.Model): 
    items = db.ListProperty(db.Key) 

या एक ListItem मॉडल है कि यह भी आदेश देने में जानकारी शामिल हैं:

class TodoListItem(db.Model): 
    item = db.ReferenceProperty(TodoItem) 
    list = db.ReferenceProperty(TodoList) 
    order = db.IntegerProperty() 

मैं निश्चित रूप से मॉडल को denormalizing करके इसे अनुकूलित कर रहा हूं, लेकिन पूर्व-अनुकूलन, क्या किसी एक प्रतिनिधित्व का दूसरे पर लाभ होता है?

उत्तर

10

यह कुछ कारकों पर निर्भर करता:

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

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

1

एक संबंधपरक संदर्भ को छोड़कर जहां कोई सामान्यीकरण के लिए दबाव डाल रहा है (निश्चित रूप से संबंधपरक मामले में काफी सलाह दी जाती है!) अलग TodoListItem "रिलेशन क्लास" मुझे थोड़ा अधिक लगता है, और कुछ हद तक "stilted" जिस तरह से एक कोड इसे बनाम बनाम समस्या के बारे में एक कारण है। ऑप्टिमाइज़ेशन-वार यह निश्चित रूप से उन सभी सूचियों को ढूंढना आसान बनाता है जिन पर कोई आइटम है।

0

यह देखते हुए कि TodoListItem एकाधिक TodoLists से संबंधित हो सकता है, मुझे चिंता होगी कि यह एक ऑर्डर संपत्ति होगी जो प्रत्येक सूची के लिए काम करेगी जिसमें आइटम संबंधित है। मुझे लगता है कि आइटम को प्रत्येक सूची के लिए ऑर्डर की आवश्यकता होगी जिसमें यह संबंधित है।