2008-10-09 11 views
7

मुझे आश्चर्य है कि यह करने योग्य होगा? डेटाबेस में एक फ़ील्ड में सरणी डालने के लिए।एक पंक्ति में डेटाबेस में सरणी डालें

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

यह एक और टेबल को अपनी वैश्विक आईडी बनाने के लिए थोड़ा अनावश्यक लगता है और फिर वैश्विक आईडी के साथ तालिका से जुड़े वास्तविक शीर्षक के साथ एक और तालिका।

मैं बस, इस

ID  TITLE 
1  Array("english title", "nederlandse titel"); 

मैं PHP/MSYQL उपयोग कर रहा हूँ की तरह कुछ है करने के लिए, इसलिए यदि यह संभव आप कृपया इन भाषाओं में समझा सकता है हो सकता है चाहता हूँ।

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

उत्तर

14

यह संभव है:

$title = serialize($array); 

और फिर डिकोड करने के लिए:

$title = unserialize($mysql_data); 

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

संपादित करें: एक अच्छा बिंदु dcousineau ने उल्लेख किया (टिप्पणियों को देखने के)

कभी कभी धारावाहिक उत्पादन, भागने के बाद भी, वर्ण क्वेरी कि शिकंजा बातें में फेंकता है। आप अपने serialize() को base64_encode() कॉल में लपेटना चाहते हैं और फिर unserialize से पहले base64_decode() का उपयोग कर सकते हैं।

उन परिस्थितियों के लिए समायोजित कोड:

$title = base64_encode(serialize($array)); 
$title = unserialize(base64_decode($mysql_data)); 
+0

मुझे इसे मारो;) –

+0

एक साइड नोट के रूप में, यदि आपको किसी डेटाबेस में स्क्रिप्ट स्टोर करने की आवश्यकता होती है तो ओवेन का समाधान भी उपयोगी होता है। –

+0

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

6

वहाँ वास्तव में केवल दो उचित यहाँ विकल्प है:

असीमित भाषाओं में असीमित खिताब
विपक्ष: एक और टेबल के साथ शामिल हों

पेशेवरों में शामिल होने के भूमि के ऊपर और अधिक computationally महंगा है, एसक्यूएल मामूली अधिक जटिल अद्यतन करने के लिए है/डालने आदि

एकाधिक स्तंभों
जैसे: TITLE_EN, TITLE_NL, TITLE_DE
पेशेवरों: तेजी से सम्मिलित करने के लिए, चयन, आदि
विपक्ष: भाषाओं की सीमित संख्या है, और अधिक एक ALTER तालिका

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

2

सरणी सामान्य का उल्लंघन करते हैं, अंतर्राष्ट्रीयकरण डेटाबेस के साथ अपने अनुभव में मैंने पाया है कि सामान्यीकृत वाक्यांशों का सबसे अच्छा डिजाइन है,

मैं आपको आसानी से पंक्तियों की थोक प्रतियां बनाने की अनुमति देता हूं - उदाहरण के लिए 'es' से 'es-mx' या 'en 'to' en-US ',' en-GB ', और मेरा पसंदीदा:' xx-piglatin '। एक सरणी स्कीमा में, आपको या तो प्रत्येक रिकॉर्ड को फिर से लिखना होगा या जटिल पार्सिंग जोड़ना होगा या एक्सएम की तरह सरणी से कुछ अधिक जटिल उपयोग करना होगा।

काम के लिए अप्रतिबंधित वाक्यांशों को खोजने के लिए LEFT JOIN एस का उपयोग करना और COALESCE का उपयोग डिफ़ॉल्ट रूप से वापस करने के लिए करना आसान है ताकि प्रोग्राम का अनुवाद न हो, भले ही वाक्यांश का अनुवाद न हो।

1

3 कॉलम वाली एक तालिका का उपयोग करें!

आईडी, TITLE_EN, TITLE_NL

वहाँ कि क्रमानुसार करने, वास्तव में कोई अच्छा कारण है!

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