यदि आप किसी सरणी फ़ील्ड का उपयोग करते हैं
- आपके DB में प्रत्येक पंक्ति का आकार थोड़ा बड़ा होने वाला है, इसलिए Postgres बहुत अधिक टोस्ट तालिकाओं का उपयोग करने जा रहा है (http://www.postgresql.org/docs/9.5/static/storage-toast.html )
- हर बार जब आप पंक्ति प्राप्त करते हैं, जब तक कि आप विशेष रूप से
defer
. का उपयोग नहीं करते हैं (https://docs.djangoproject.com/en/1.9 /ref/models/querysets/#defer ) फ़ील्ड या अन्यथा इसेonly
. के माध्यम से क्वेरी से बाहर कर दें , याvalues
या कुछ और, जब भी आप उस पंक्ति में पुनरावृति करते हैं, तो आप उन सभी मूल्यों को लोड करने की लागत का भुगतान करते हैं। अगर आपको यही चाहिए तो हो। - उस सरणी में मानों के आधार पर फ़िल्टर करना, जबकि संभव हो उतना अच्छा नहीं होगा और Django ORM इसे उतना स्पष्ट नहीं करता जितना कि यह M2M तालिकाओं के लिए करता है।
यदि आप M2M का उपयोग करते हैं
- आप उन संबंधित मानों पर अधिक आसानी से फ़िल्टर कर सकते हैं
- वे फ़ील्ड डिफ़ॉल्ट रूप से स्थगित हैं, आप
prefetch_related
का उपयोग कर सकते हैं यदि आपको उनकी आवश्यकता है और फिर फैंसी प्राप्त करें यदि आप केवल उन मूल्यों का एक सबसेट लोड करना चाहते हैं - कुंजी और अतिरिक्त आईडी फ़ील्ड के कारण M2M के साथ DB में कुल संग्रहण थोड़ा अधिक होने वाला है
- चाबियों के कारण इस मामले में जुड़ने की लागत पूरी तरह से नगण्य है।
व्यक्तिगत रूप से मैं कहूंगा कि एम 2 एम टेबल के साथ जाएं, लेकिन मुझे आपका विशिष्ट एप्लिकेशन नहीं पता है। यदि आप बड़ी मात्रा में डेटा के साथ काम करने जा रहे हैं, तो यह एक प्रतिनिधि डेटासेट को हथियाने और इसके साथ दोनों विधियों का परीक्षण करने के लायक है।