แนวทางปฏิบัติที่ดีที่สุดสำหรับการออกแบบฐานข้อมูลหลายภาษาคืออะไร [ปิด]


193

วิธีที่ดีที่สุดในการสร้างฐานข้อมูลหลายภาษาคืออะไร? ในการสร้างตารางที่แปลเป็นภาษาท้องถิ่นสำหรับทุกตารางที่ทำการออกแบบและทำการสืบค้นที่ซับซ้อนในกรณีอื่น ๆ การเพิ่มคอลัมน์สำหรับแต่ละภาษานั้นง่าย แต่ไม่ใช่แบบไดนามิกโปรดช่วยฉันให้เข้าใจสิ่งที่ดีที่สุดสำหรับแอปพลิเคชันองค์กร



3
ฉันพบสิ่งนี้มีประโยชน์กับฉันมาก: การออกแบบฐานข้อมูลหลายภาษาใน MySQL
Siamak A.Motlagh

คำตอบ:


223

สิ่งที่เราทำคือการสร้างสองตารางสำหรับแต่ละวัตถุหลายภาษา

เช่นตารางแรกมีเพียงข้อมูลที่เป็นกลางทางภาษา (คีย์หลัก ฯลฯ ) และตารางที่สองมีหนึ่งระเบียนต่อภาษาซึ่งมีข้อมูลที่แปลเป็นภาษาท้องถิ่นและรหัส ISO ของภาษา

ในบางกรณีเราเพิ่มเขตข้อมูล 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
จะเกิดอะไรขึ้นถ้าฟิลด์ที่เป็นกลางภาษาเดียวคือ id และคุณแทรกการอ้างอิงคีย์ต่างประเทศอย่างไรเมื่อแทรกแถว?
Timo Huovinen

4
มันตลกดีที่ฉันออกแบบชุดฐานข้อมูลสำหรับ CMS หลายภาษาและมีคำถามนี้ในหัวของฉันด้วย ฉันเลือกวิธีนี้ก่อนที่ฉันจะเห็นคำตอบนี้! ขอบคุณสำหรับคำตอบนี้!
Patrick Manser

5
สิ่งหนึ่งที่ควรทราบที่นี่คือจะไม่มี PK ในตารางนี้หรือ ID และภาษาต้องเป็นคอมโพสิต PK อาจเป็นได้ว่าคุณต้องการเพิ่มฟิลด์ ProductTranslationId ซึ่งอาจเป็นข้อมูลประจำตัว
Daniel Lorenz

1
@Luca: ฉันตอบคำถามของคุณโดยแสดงว่ามีการใช้งานอย่างไรเพื่อโหลดข้อมูล
M4N

1
@ AarónGutiérrezดีพอที่จะสร้างตารางที่มีคอลัมน์เดียวชื่อid: D ในการอธิบายแต่ละคำidแทนความหมายที่คุณสามารถแนบคำจากภาษาใด ๆ ในตารางสัมพันธ์ดังนั้นคุณจะได้รับสองตารางmeaning(id) และword(id, meaning_id), idในwordตารางแสดงคำว่า id, idในการmeaningแสดงถึง ความหมายที่เป็นสากล
Timo Huovinen

18

ฉันแนะนำคำตอบที่โพสต์โดย Martin

แต่ดูเหมือนว่าคุณจะกังวลเกี่ยวกับข้อความค้นหาของคุณที่ซับซ้อนเกินไป:

ในการสร้างตารางที่แปลเป็นภาษาท้องถิ่นสำหรับทุกตารางจะทำการออกแบบและทำการสืบค้นที่ซับซ้อน ...

ดังนั้นคุณอาจจะคิดว่าแทนที่จะเขียนคำง่ายๆเช่นนี้:

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 ง่ายต่อการเขียน CMS
Arsen Mkrtchyan

14

ฉันพบว่าวิธีการนี้ใช้ได้ผลสำหรับฉัน:

ผลิตภัณฑ์ผลิตภัณฑ์รายละเอียดประเทศ
========= ================== =========
สินค้ารหัสสินค้ารายละเอียดประเทศรหัสสินค้า
- ฯลฯ - ชื่อประเทศ ProductId
            ภาษาชนบท
            ชื่อผลิตภัณฑ์ - ฯลฯ -
            ProductDescription
            - ฯลฯ -

ตาราง ProductDetail มีการแปลทั้งหมด (สำหรับชื่อผลิตภัณฑ์คำอธิบาย ฯลฯ ) ในภาษาที่คุณต้องการให้การสนับสนุน คุณอาจต้องการแบ่งตารางประเทศลงเพื่อใช้ภาษาในภูมิภาคทั้งนี้ขึ้นอยู่กับข้อกำหนดของแอปของคุณ


ฉันเลือกวิธีการเดียวกันนี้สำหรับโครงการที่ฉันกำลังทำงานอยู่เนื่องจากตำแหน่งที่ตั้งอื่นของฉันมีข้อมูลเฉพาะเกี่ยวกับระบบหน่วยและการวัดที่จะแสดงต่อผู้ใช้
califrench

8
ประเทศและภาษา (ตำแหน่งที่ตั้ง) เป็นสิ่งที่แตกต่างกัน และรหัสภาษา ISO เป็นกุญแจธรรมชาติคุณกำจัดการเข้าร่วมที่ไม่จำเป็นจาก lang to country
gavenkoa

10

ฉันใช้วิธีการต่อไป:

สินค้า

รหัสผลิตภัณฑ์ OrderID, ...

productinfo

ชื่อผลิตภัณฑ์ ProductID ภาษา ID

ภาษา

ชื่อภาษา LanguageID, ....


2

โซลูชันของ Martin นั้นคล้ายกับของฉันมาก แต่คุณจะรับมือกับคำอธิบายเริ่มต้นอย่างไรเมื่อไม่พบคำแปลที่ต้องการ

นั่นจะต้องใช้ IFNULL () และคำสั่ง SELECT อื่นสำหรับแต่ละฟิลด์หรือไม่?

การแปลเริ่มต้นจะถูกเก็บไว้ในตารางเดียวกันโดยที่ค่าสถานะเช่น "isDefault" ระบุว่าคำอธิบายนั้นเป็นคำอธิบายเริ่มต้นในกรณีที่ไม่พบภาษาปัจจุบัน


1
@GorrillaApe: ดูคำตอบนี้สำหรับตัวอย่างวิธีย้อนกลับไปเป็นภาษาเริ่มต้นหากไม่พบภาษาที่ต้องการ: stackoverflow.com/a/27474681/19635
M4N
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.