बहु-भाषा डेटाबेस डिजाइन के लिए सर्वोत्तम अभ्यास क्या हैं? [बन्द है]


193

बहु-भाषा डेटाबेस बनाने का सबसे अच्छा तरीका क्या है? प्रत्येक तालिका के लिए स्थानीयकृत तालिका बनाने के लिए डिज़ाइन और क्वेरी को जटिल बना रहा है, दूसरे मामले में प्रत्येक भाषा के लिए कॉलम जोड़ने के लिए सरल है, लेकिन गतिशील नहीं है, कृपया मुझे यह समझने में मदद करें कि उद्यम अनुप्रयोगों के लिए सबसे अच्छा विकल्प क्या है



3
मुझे यह मेरे लिए बहुत मददगार लगा है: MySQL में बहुभाषी डेटाबेस डिज़ाइन
सियामक ए। मोत्लघ जू

जवाबों:


223

हम क्या करते हैं, प्रत्येक बहुभाषी वस्तु के लिए दो तालिकाओं का निर्माण करना है।

उदाहरण के लिए पहली तालिका में केवल भाषा-तटस्थ डेटा (प्राथमिक कुंजी, आदि) है और दूसरी तालिका में प्रति भाषा एक रिकॉर्ड है, जिसमें स्थानीय डेटा और भाषा का आईएसओ कोड शामिल है।

कुछ मामलों में हम एक DefaultLanguage फ़ील्ड जोड़ते हैं, ताकि हम उस भाषा पर वापस आ सकें, यदि कोई निर्दिष्ट भाषा के लिए कोई स्थानीय डेटा उपलब्ध नहीं है।

उदाहरण:

Table "Product":
----------------
ID                 : int
<any other language-neutral fields>


Table "ProductTranslations"
---------------------------
ID                 : int      (foreign key referencing the Product)
Language           : varchar  (e.g. "en-US", "de-CH")
IsDefault          : bit
ProductDescription : nvarchar
<any other localized data>

इस दृष्टिकोण के साथ, आप आवश्यकतानुसार कई भाषाओं को संभाल सकते हैं (प्रत्येक नई भाषा के लिए अतिरिक्त फ़ील्ड जोड़ने के बिना)।


अद्यतन (2014-12-14): कृपया इस उत्तर पर एक नज़र डालते हैं , बहुभाषी डेटा को एक अनुप्रयोग में लोड करने के लिए उपयोग किए जाने वाले कार्यान्वयन के बारे में कुछ अतिरिक्त जानकारी के लिए।


15
क्या होगा यदि एकमात्र भाषा-तटस्थ क्षेत्र आईडी है? और पंक्ति को सम्मिलित करते समय आप विदेशी कुंजी संदर्भ को कैसे सम्मिलित करते हैं?
टिमो हुओवेंन

4
यह मजेदार है, कि मैं एक बहुभाषी सीएमएस के लिए एक डेटाबेस योजना तैयार कर रहा था और मेरे सिर में यह सवाल था। मैंने इस दृष्टिकोण को चुना, इससे पहले कि मैंने यह उत्तर देखा! इस उत्तर के लिए धन्यवाद!
पैट्रिक मैनसर

5
यहां एक बात ध्यान देने वाली है कि इस टेबल पर या तो कोई पीके नहीं होगा या आईडी और लैंग्वेज को कंपोजिट पीके होना चाहिए। या तो वह, या आपको ProductTranslationId फ़ील्ड जोड़ने की आवश्यकता है, शायद एक पहचान के रूप में।
डेनियल लॉरेंज

1
@ लुका: मैंने आपके प्रश्न का उत्तर दिया, जिसमें दिखाया गया है कि मैं डेटा लोड करने के लिए किस कार्यान्वयन (ओं) का उपयोग करता हूं।
M4N

1
@ AarónGutiérrez ठीक है, मज़े की बात है कि आप एक एकल स्तंभ के साथ एक तालिका बनाते हैं id: डी। समझाने के लिए, प्रत्येक idएक अर्थ है जो करने के लिए आप एक संबंधपरक तालिका में किसी भी भाषा से शब्द संलग्न कर सकते हैं, तो आप दो तालिकाओं मिलता है, का प्रतिनिधित्व करता है meaning(आईडी) और word(आईडी, meaning_id), idमें wordतालिका शब्द आईडी का प्रतिनिधित्व करता है, idमें meaningका प्रतिनिधित्व करता है वह अर्थ जो सार्वभौमिक है।
टिमो हुओवेनन

18

मैं मार्टिन द्वारा पोस्ट किए गए उत्तर की सिफारिश करता हूं।

लेकिन आपको लगता है कि आपके प्रश्न बहुत जटिल हो रहे हैं:

प्रत्येक तालिका के लिए स्थानीयकृत तालिका बनाने के लिए डिज़ाइन और क्वेरी को जटिल बना रहा है ...

तो आप सोच रहे होंगे कि इस तरह सरल प्रश्न लिखने के बजाय:

SELECT price, name, description FROM Products WHERE price < 100

... आपको इस तरह प्रश्न लिखना शुरू करना होगा:

SELECT
  p.price, pt.name, pt.description
FROM
  Products p JOIN ProductTranslations pt
  ON (p.id = pt.id AND pt.lang = "en")
WHERE
  price < 100

बहुत सुंदर परिप्रेक्ष्य नहीं।

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

उस प्रणाली का उपयोग करना कुछ इस तरह दिख सकता है:

db.setLocale("en");
db.query("SELECT p.price, _(p.name), _(p.description)
          FROM _(Products p) WHERE price < 100");

और मुझे यकीन है कि आप इससे भी बेहतर कर सकते हैं।

कुंजी आपके टेबल और फ़ील्ड को समान रूप से नामित करने के लिए है।


अन्य प्रश्न यह है कि उत्पाद के लिए एक व्यावसायिक वस्तु कैसे बनाई जाए? या दो बनाने के लिए ... पहले मामले में उस आइटम के साथ काम करना आसान है, 2 एनएम में सीएमएस लिखना आसान है
आर्सेन मकर्त्च्येन

14

मुझे लगता है कि मेरे लिए इस प्रकार का दृष्टिकोण काम करता है:

उत्पाद ProductDetail देश
========= ================== =========
ProductId ProductDetailId CountryId
- आदि - ProductId देशनाम
            देश भाषा
            उत्पाद का नाम - आदि -
            उत्पाद वर्णन
            - आदि -

ProductDetail तालिका आपके द्वारा समर्थित भाषाओं में सभी अनुवाद (उत्पाद का नाम, विवरण आदि के लिए) रखती है। अपने एप्लिकेशन की आवश्यकताओं के आधार पर, आप क्षेत्रीय भाषाओं का भी उपयोग करने के लिए देश तालिका को तोड़ना चाह सकते हैं।


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

8
देश और भाषा (स्थान) अलग-अलग चीजें हैं। और आईएसओ भाषा कोड प्राकृतिक कुंजी हैं, आप देश से देश में अनावश्यक जुड़ाव को समाप्त करते हैं।
गवेंको

10

मैं अगले दृष्टिकोण का उपयोग कर रहा हूं:

उत्पाद

ProductID आर्डर, ...

उत्पाद की जानकारी

ProductID शीर्षक नाम LanguageID

भाषा: हिन्दी

LanguageID नाम संस्कृति,…।


2

मार्टिन का समाधान मेरे लिए बहुत समान है, हालांकि जब आप वांछित अनुवाद नहीं पाते हैं तो आप डिफ़ॉल्ट विवरण कैसे संभालेंगे?

क्या प्रत्येक क्षेत्र के लिए एक IFNULL () और दूसरे चयन कथन की आवश्यकता होगी?

डिफ़ॉल्ट अनुवाद को उसी तालिका में संग्रहीत किया जाएगा, जहां "isDefault" जैसा एक झंडा, जो कि वर्तमान भाषा के लिए कोई भी नहीं पाया गया है, उस विवरण को डिफ़ॉल्ट वर्णन को इंगित करता है।


1
@GillaillaApe: उदाहरण के लिए इस उत्तर को देखें कि कैसे डिफ़ॉल्ट भाषा में वापस आना है, अगर वांछित भाषा नहीं मिली: stackoverflow.com/a/27474681/19635
M4N
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.