पोस्ट मेटा बनाम अलग डेटाबेस टेबल


29

डेटा स्टोरेज की आवश्यकता वाले प्लगइन्स को विकसित करते समय, एक विधि या किसी अन्य का उपयोग करने के पेशेवरों और विपक्षों को क्या चाहिए?

स्पष्टीकरण कोडेक्स में दिए गए विवरण नहीं है:

हालांकि, एक पूरी नई तालिका के साथ कूदने से पहले, इस पर विचार करें कि क्या वर्डप्रेस पोस्ट मेटा (उर्फ कस्टम फील्ड्स) में आपके प्लगइन के डेटा को संग्रहीत किया जाएगा। पोस्ट मेटा पसंदीदा तरीका है; जब संभव हो इसका उपयोग करें / व्यावहारिक।


FYI करें: MB कस्टम टेबल एक प्लगइन है जो WP के पोस्ट मेटा टेबल के बजाय कस्टम डेटा को मेटा टेबल पर स्टोर कर सकता है।
आह ट्रान

जवाबों:


30

ठीक है, अगर मैं एक WP स्क्रिप्ट किडी की टोपी लेता हूं, तो मेरा जवाब होगा: पोस्ट_मेटा का उपयोग करें, हमेशा।

हालाँकि, मुझे डेटाबेस के बारे में एक या दो बातें पता हैं, इसलिए मेरा जवाब है: कभी भी, कभी भी, कभी भी डेटा को स्टोर करने के लिए एक EAV (पोस्ट_मेटा टेबल उर्फ) का उपयोग करें जिसे आपको क्वेरी करने की आवश्यकता हो सकती है।

सूचकांक के मोर्चे पर, मेटा टेबल्स में मूल रूप से उपयोग करने लायक कोई भी नहीं है। इसलिए, यदि आप डेटा टाइप XYZ स्टोर कर रहे हैं और उम्मीद कर रहे हैं कि आप उन सभी पोस्टों की क्वेरी करेंगे, जिनके पास XYZ का मूल्य है 'abc', तो अच्छा ... सौभाग्य। (WP ट्रेक में सभी उपयोगकर्ताओं / भूमिकाओं / कैप्स से संबंधित टिकट देखें कि आपको यह पता चल सकता है कि यह कैसे प्राप्त हो सकता है।)

शामिल होने के मोर्चे पर, आप जल्दी से उस सीमा में दुर्घटनाग्रस्त हो जाते हैं जिस पर ऑप्टिमाइज़र क्वेरी का विश्लेषण करने के बजाय एक जेनेरिक एल्गोरिथ्म का उपयोग करने का निर्णय लेता है, जब कई सम्मिलित मापदंड होते हैं।

इस प्रकार, नहीं, नहीं, नहीं, नहीं। कभी मत, कभी, कभी भी एक मेटा का उपयोग करें। जब तक आप जो स्टोर कर रहे हैं वह कॉस्मेटिक है और कभी भी क्वेरी मापदंड का हिस्सा नहीं होगा।

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


1
हां, मैं जो प्लगइन्स विकसित कर रहा हूं वह घटनाओं, समाचारों, प्रेस विज्ञप्तियों, जॉब ऑफर्स जैसे कस्टम डेटा को संभाल रहा है ... बाहर से "वर्डप्रेस वर्ल्ड", तालिकाओं का उपयोग करना वास्तव में एक विकल्प नहीं है। लेकिन वर्डप्रेस कोडेक्स से सलाह, थोड़ा भ्रमित है। सामान्यीकृत / संरचित / अनुक्रमित डेटा के लिए डेटा के क्रमबद्ध विखंडू को कैसे पसंद किया जा सकता है?
नासिफ़ बॉरगिग

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

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

6
@ डेनिस - पोस्टमेटा, एह के खिलाफ भावुक वकालत? आप जानते हैं कि आप रूढ़िवादी के खिलाफ मजबूती से जा रहे हैं और आप चर्च ऑफ कोड कविता के उच्च पुरोहितों के अच्छे कामों से बाहर निकलेंगे यदि आप इस तरह की बात करते हैं, तो आप नहीं? :-) लेकिन गंभीरता से क्या आपको नहीं लगता कि आप थोड़े से समय से अधिक हैं? यह वास्तव में इस बात पर निर्भर करता है कि क्या हजारों मेटा रिकॉर्ड होने वाले हैं या नहीं। कई मामलों में बस चिंता करने के लिए पर्याप्त रिकॉर्ड नहीं हैं। एक जटिल साइट, जिसे मैं तैनात कर रहा हूँ, जिसमें कुछ नए रिकॉर्ड के साथ लगभग 10,000 मेटा रिकॉर्ड की योजना है, और यह ठीक है (फी, यह एक ब्लॉग नहीं है।)
माइकस्किंकेल

1
@ डेनिस - टिप्पणियों के लिए धन्यवाद। और मुझे गलत मत समझो, मैं शायद आपके दृष्टिकोण के लिए बहुत अधिक झुक गया हूं, लेकिन 1.) पॉड-लाइक फ़ील्ड्स के गुणों और 2.) मेटा की सादगी पर वर्डकैंप बर्मिंघम में मैट के साथ एक घंटे की बहस। संभावित रूप से बदल सकने वाले अन्य मुद्दों पर मेरे ध्यान केंद्रित करने के लिए इस्तीफा दे दिया गया है। WCB में मुझे एहसास हुआ कि जब तक मैट चार्ज होगा तब तक यह नहीं बदलेगा क्योंकि (मेरा अनुमान है) मैट कम तालिकाओं के विचार से इतना प्रभावित है कि वह खुद को 768 बाइट पर अनुक्रमित करने के नीचे के पक्षों को पहचानने की अनुमति नहीं देगा। कुंजी। <sigh>
माइकस्किंकेल

5

यदि आपके प्लगइन में डेटा की बहुत कमी है, तो wp_postmetaनीचे दिखाए अनुसार एक अच्छा विचार नहीं है:

WooCommerce को एक उदाहरण के रूप में, ~ 30,000 उत्पादों के साथ एक स्टोर में, औसतन कहा जाएगा, ~ 40 पोस्ट मेटा (गुण और सब कुछ) प्रति उत्पाद, उत्पाद के प्रति 5 उत्पाद चित्र, जिसका अर्थ है ~ 4 छवि मेटा प्रत्येक छवि के लिए:

30,000 उत्पादों x 40 मेटा प्रत्येक = 1,200,000 पंक्तियों में wp_postmeta

+

30,000 उत्पाद x 5 चित्र प्रत्येक x 4 छवि मेटा प्रत्येक = 600,000 पंक्तियों के लिए wp_postmeta

तो केवल 30,000 उत्पादों के साथ आप 1,800,000 पंक्तियों में देख रहे हैं wp_postmeta

यदि आप अपने उत्पादों या अपने उत्पाद चित्रों में अधिक गुण जोड़ते हैं, तो यह संख्या कई गुना बढ़ जाएगी।

इसके साथ समस्या दुगुनी है:

  • MySQL के साथ Self Joins बहुत महंगे हैं
  • wp_postmetaजब तक आप बाद के mysql संस्करणों (यानी के लिए कोई पूर्ण सूचकांक meta_value) का उपयोग नहीं कर रहे हैं तब तालिका अनुक्रमित नहीं होती है

वास्तविक मामले से एक उदाहरण देने के लिए:

SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE '_shipping_city'

यह सभी ऑर्डर विवरणों से शिपिंग शहर का चयन करता है, एक एंट्री लेवल समर्पित सर्वर पर ~ 3 सेकंड में आता है, भले ही 5-10 ऑर्डर हों । ऐसा इसलिए है क्योंकि क्वेरी को किसी wp_postmetaतालिका के बीच से चलाया जाता है जिसमें लाइव इंस्टॉलेशन में ~ 3 मिलियन पंक्तियाँ होती हैं।

यहां तक ​​कि होम पेज काफी धीमा आता है, क्योंकि थीम विभिन्न तत्वों को खींचती है wp_postmeta- स्लाइडर्स, कुछ समीक्षा आवेषण, कुछ अन्य मेटा। सामान्य उत्पाद सूची में बहुत धीमी है, उत्पादों को सूचीबद्ध करते समय खोज समान रूप से धीमी होती है।

आप इसे किसी भी सामान्य साधन के माध्यम से ठीक नहीं कर सकते। आप अपने सर्वर में इलास्टिक सर्च डाल सकते हैं और Wordpress में Elastic Search plugin का उपयोग कर सकते हैं, आप redis / memcached का उपयोग कर सकते हैं, आप एक अच्छे पेज कैश प्लगइन का उपयोग कर सकते हैं, लेकिन अंत में मूलभूत मुद्दा रहेगा - एक फूला हुआ कोई भी डेटा प्राप्त करना। wp_postmetaतालिका जब भी होगी, धीमी होगी। सर्वर पर जहां मैंने नीचे लागू किए गए समाधान का परीक्षण किया था, इन सभी को ठीक से और अनुकूलित करके स्थापित और कॉन्फ़िगर किया गया था, और साइट ने उपयोगकर्ताओं को या आमतौर पर किए गए प्रश्नों के लिए ठीक से काम किया क्योंकि कैशिंग प्लग इन में किकिंग हुई।

लेकिन जिस क्षण उपयोगकर्ता में लॉग इन किया गया वह कुछ ऐसा करने की कोशिश करता है जो आमतौर पर नहीं किया गया था या क्रोन, कैशिंग प्लगइन्स, या कोई अन्य उपयोगिता db से वास्तविक डेटा प्राप्त करना चाहती थी ताकि उसे कैश किया जा सके या कुछ और किया जा सके, चीजें धीमी हो गईं।

इसलिए मैंने कुछ और कोशिश की:

मैंने सभी उत्पाद मेटा (पोस्ट टाइप उत्पाद के लिए पोस्टमेटा ) को कोड द्वारा उत्पन्न कस्टम टेबल पर ले जाने के लिए एक छोटा प्लगइन कोडित किया। इस प्लगइन ने प्रत्येक पोस्ट के लिए सभी मेटा लिया और प्रत्येक मेटा को कॉलम के रूप में जोड़कर और प्रत्येक पंक्ति में मान डालकर एक टेबल बनाया। मैंने ईएवी प्रारूप को एक क्षैतिज, सपाट संबंधपरक प्रारूप में बदल दिया। मेरे पास मेज से सभी स्थानांतरित उत्पादों से पोस्टमेट को हटाने का प्लगइन भी था wp_postmeta

जब मैं उस पर होता हूं, तो मैं अपने सभी तालिकाओं में अनुलग्नक पोस्टमेटा और अन्य सभी पोस्ट प्रकार के मेटा को स्थानांतरित कर देता हूं ।

फिर मैं get_(post_type)_metaनए कस्टम टेबल से उनकी सेवा करने के लिए मेटाडेटा की पुनर्प्राप्ति को ओवरराइड करने के लिए फ़िल्टर में झुका ।

अब वही क्वेरी पहले से, जिसमें wp_postmeta~ 0.006 सेकंड लगने में ~ 3 सेकंड का समय लगता था। साइट अब व्यवहार करती है जैसे कि यह एक ताजा WP इंस्टॉलेशन था।

....................

स्वाभाविक रूप से, Wordpress तरीका बेहतर है। यह वास्तव में आदर्श है।

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

उस संदर्भ में, किसी को यह बताना मुश्किल है कि डेटा के ढेर टन का इरादा है और - यह wp_postmetaसुनिश्चित करने के लिए तालिका का उपयोग करने के लिए उस डेटा पर भगवान ना करें / खोज करें। प्रदर्शन हिट बहुत अच्छा होगा।

अपने कस्टम तालिकाओं का उपयोग करने से आपका डेटा ढेर हो जाएगा और अभी भी काफी तेजी से बना रहेगा।

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

आपको यह सुनिश्चित करना होगा कि किसी भी अन्य प्लगइन / एडऑन डेवलपर के पास डेटा को पुनः प्राप्त करने से पहले और बाद में अपने डेटा को हेरफेर करने के लिए अपने प्लगइन में हुक करने का मतलब है। यदि आप ऐसा करते हैं, तो आप बहुत ठोस हैं।


1
दिलचस्प सामान! स्पष्ट करने वाली एक बात यह है कि उल्लिखित "get_ (post_type) _meta" फ़िल्टर को वास्तव में "get_ (मेटा-टाइप) _metadata" कहा जाता है, जहाँ मेटा-टाइप या तो पोस्ट, टिप्पणी या उपयोगकर्ता है। तो get_post_meta () get_post_metadata फ़िल्टर के माध्यम से जाएगा, पोस्ट प्रकार की परवाह किए बिना। फ़िल्टर का रिटर्न मान वही है जो आप चाहते हैं कि अंतिम मेटा वैल्यू हो।
बेरेंड

get__ (मेटा-प्रकार) _metadata -> वास्तव में यह सभी पोस्ट प्रकारों के साथ काम करता है, और वास्तव में अंतिम फ़ंक्शन जो विज़िट किया जाता है वह है get_post_metadata। हालाँकि फ़िल्टर तब काम करता है जब आप इसका उपयोग करते हैं।
एकता 100

2

यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं। WP तरीका मौजूदा तालिकाओं का उपयोग करना है, क्योंकि वे काफी लचीले होने के लिए डिज़ाइन किए गए हैं, हालांकि कभी-कभी आप डेटा के एक नए वर्ग तक पहुंचेंगे, जिसे मौजूदा तालिका में नहीं रखा जा सकता है, जैसे कि आपको श्रेणी मेटा डेटा चाहिए था , आप एक wp_termsmeta तालिका बनाने के लिए चुन सकते हैं।

हालांकि, आमतौर पर आप अपने डेटा को अलग-अलग तालिकाओं में काफी आराम से संग्रहीत कर सकते हैं, और जहां आप अपना डेटा संग्रहीत करते हैं, यह इस बात पर निर्भर करता है कि आपका प्लगइन क्या करता है।

  • सामान्य प्लगइन सेटिंग्स के लिए, get_option () API कॉल का उपयोग करें - यह भी कैश किया जाएगा।
  • प्लगइन सेटिंग के लिए जो किसी विशेष पोस्ट के लिए, फिर get_post_meta () के साथ प्रति पोस्ट कस्टम मेटा डेटा का उपयोग करें । यह आमतौर पर आप की जरूरत के लिए बहुत है।

वर्डप्रेस के भीतर कैशिंग लागू किया गया है ताकि आपकी प्रतिक्रिया समय भी तेज हो सके।


1

डेनिस 100% के साथ सहमत हुए। लेकिन इसके चारों ओर एक रास्ता है।

मूल्यों को पुन: प्रकाशित करने के लिए पोस्ट मेटा का उपयोग करने में समस्या तब होती है जब मान सरणी के होते हैं जैसे कि:

array(
'key1' => 'val 1',
'key2' => 'val 2'
);

यह db में क्रमबद्ध स्ट्रिंग के रूप में संग्रहीत होता है, जो कुछ इस तरह दिखाई देगा:

{array["key1"]...{}...}

इसलिए जब आप सभी पोस्ट को क्वेरी करना चाहते हैं, array['key2'] = 'val 2'तो wp को ऐरे नाम की हर मेटा एंट्री खींचनी होगी, उसे अनपैक करना होगा, फिर उसे टेस्ट करना होगा, फिर नेक्स्ट पर जाना होगा। यह निश्चित रूप से आपके सर्वर को नीचे लाएगा यदि आपकी साइट सफल है और इसमें बहुत सारे पोस्ट, पेज, कस्टम पोस्ट आदि हैं।

समाधान परियोजना पर निर्भर करता है, और आप देखेंगे कि क्यों। यदि आप डेटा को स्टोर करने के लिए थे var = valतो wp हर एक टेस्ट को अनपैक किए बिना php को सर्च कर सकेगा। ऊपर के परिदृश्य में ऐसा करने के लिए आप कुछ नामस्थान का उपयोग करेंगे और मेटा कुंजियों को संग्रहीत करेंगे:

_array_key1 = 'val 1';
_array_key2 = 'val 2';

इसके बाद wp के साथ कुंजी 2 की तलाश करने वाले wp इसे सीधे खींच सकेंगे। हालांकि यह परियोजना पर निर्भर करता है। मेरी वर्तमान परियोजना प्रत्येक कस्टम पोस्ट के साथ स्टोर होने के लिए लगभग 20 अलग-अलग डेटाटेप्स पर निर्भर करती है, इसलिए ऊपर केवल खोज करने के लिए एक विशाल तालिका बनाई जाएगी, यह देखते हुए कि हम 100 के हजारों पदों की उम्मीद कैसे कर रहे हैं। तो उस परिदृश्य में एक कस्टम तालिका ही एकमात्र तरीका है।

आशा है कि यह किसी की मदद करता है


0

मेरी फार्मविले साइट के लिए :) मैंने दोनों किया लेकिन कभी इसे खत्म नहीं किया क्योंकि मैंने इसे बेच दिया:

  1. मैंने फार्मविले एक्सएमएल पढ़ा और कस्टम टेबल में डेटा डंप किया
  2. वर्डप्रेस में मेरे पास उस तालिका के प्रत्येक फ़ील्ड के लिए स्वचालित रूप से बनाए गए कस्टम फ़ील्ड (और कुछ अतिरिक्त) हैं
  3. अब चिंता करें कि क्या होता है यदि मान या तो तालिका में या दूसरी तरफ बदलता है: कस्टम फ़ील्ड क्योंकि उन्हें लगातार सिंक में होना चाहिए

मैंने ऐसा इसलिए किया क्योंकि मैं एक तरफ चाहता था कि उपयोगकर्ता नए फार्मविले डेटा में प्रवेश करके वर्डप्रेस साइट को संपादित करें जैसे "एक गाय की कीमत 10 सिक्के" लेकिन एकीकरण की तरफ से BUT: यदि xml में बदलाव से गाय के बारे में पता चलता है कि अब गाय की कीमत "20 के सिक्के" है (फ्रंट-एंड एडिटिंग प्लगइन के माध्यम से) जो इसके बाद विकल्प के रूप में दिया जाएगा: ताकि या तो XML या उपयोगकर्ता सही था (विकी सिस्टम की तरह)।

तो यहाँ दोनों का उपयोग करते समय एक उदाहरण है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.