แนวทางการออกแบบฐานข้อมูลหลายภาษา (Multi-Language Database)

4 พฤษภาคม 2566
แนวทางการออกแบบฐานข้อมูลหลายภาษา (Multi-Language Database)

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

Database ที่ดีควรง่ายที่คุณจะแก้ไขแอปพลิเคชันหรือเพิ่มฟังก์ชันใหม่ในขณะที่ยังคงรองรับหลายภาษา โดยไม่ต้องเพิ่มความพยายามหรือค่าใช้จ่ายเพิ่มเติม นอกจากนี้ยังควรง่ายที่คุณจะรวมภาษาใหม่โดยไม่ต้องแก้ไขแอปพลิเคชันมากนัก

คำแนะนำของฉันในที่นี้คือให้เลือกการออกแบบ Database แบบที่มีฟังก์ชันการทำงานและความยืดหยุ่นมากกว่าเสมอ บางครั้งเราคิดผิดว่าแอปพลิเคชันของเรามีขนาดเล็กเกินไป ซึ่งไม่คุ้มที่จะใช้โครงสร้างข้อมูลที่ซับซ้อนเพื่อแก้ปัญหาต่างๆ เช่น การรองรับหลายภาษา แต่ในที่สุด แอปพลิเคชันนั้นจะเติบโตและเราจะเสียใจที่เลือกใช้วิธีที่ไม่มีความยืดหยุ่นมากพอซึ่งดูเหมือนง่าย ไปดูแนวทางในการออกแบบฐานข้อมูลหลายภาษา (Multi-Language Database) กันเลย

1. แบบเพิ่มคอลัมน์ภาษา

วิธีนี้เป็นวิธีที่ง่ายที่สุด จุดประสงค์หลักคือสร้างคอลัมน์เพิ่มเติมสำหรับแแต่ละภาษาที่ต้องแปลข้อความ

Column Approach 1
// ตัวอย่าง SQL
SELECT * FROM Products WHERE id = 1
ข้อดี
  • ความเรียบง่าย ง่ายต่อการนำไปใช้
  • สืบค้นง่าย ไม่จำเป็นต้อง JOIN
  • ไม่มีรายการที่ซ้ำกัน ไม่มีเนื้อหาที่ซ้ำกัน มีเพียงแถวเดียวสำหรับแต่ละข้อมูล และเฉพาะคอลัมน์ภาษาเท่านั้นที่ซ้ำกัน
ข้อเสีย
  • ดูแลรักษายาก ใช้งานได้ง่ายสำหรับ 2-3 ภาษา แต่จะยากขึ้นเมื่อคุณมีคอลัมน์จำนวนมากหรือมีหลายภาษา
  • ยากที่จะเพิ่มภาษาใหม่ การเพิ่มภาษาใหม่จำเป็นต้องเปลี่ยนโครงสร้างข้อมูล สำหรับแต่ละตารางที่มีเนื้อหาหลายภาษา
  • พื้นที่จัดเก็บ หากไม่จำเป็นต้องมีการแปลทั้งหมด เช่น ควรใช้ภาษาเริ่มต้นในบางสถานที่ อาจทำให้ข้อมูลซ้ำซ้อนหรือฟิลด์ DB ว่างเปล่า

2. แบบรวมข้อมูลทุกภาษาไว้ในคอลัมน์เดียวกัน

แนวคิดในการเก็บคำแปลไว้ในตารางเดียวกัน ซึ่งจะช่วยให้เราสามารถจัดเก็บคำแปลทั้งหมดในช่องเดียวกัน โดยจัดระเบียบไว้ในโครงสร้างข้อมูล เช่น เอกสาร XML หรือออบเจกต์ JSON ด้านล่างนี้เรามีตัวอย่าง

Column Approach 2
// ตัวอย่าง SQL
SELECT id, price, translate.title, translate.detail FROM Products CROSS APPLY OPENJSON(Products.translate) WITH ( lang varchar(2) '$.lang', title varchar(100) '$.translate.title’ detail varchar(100) '$.translate.detail’ ) AS translate WHERE translate.lang = 'th' AND id = 1;
ข้อดี
  • ความเรียบง่าย ง่ายต่อการนำไปใช้
  • สืบค้นง่าย ไม่จำเป็นต้อง JOIN
  • ไม่มีรายการที่ซ้ำกัน ไม่มีเนื้อหาที่ซ้ำกัน มีเพียงแถวเดียวสำหรับแต่ละข้อมูล
  • การทำให้เป็นมาตรฐานที่เหมาะสม ดูเหมือนเป็นแนวทางที่สะอาดและสัมพันธ์กัน
ข้อเสีย
  • ดูแลรักษายาก ใช้งานได้ง่ายสำหรับ 2-3 ภาษา แต่จะยากขึ้นเมื่อคุณมีคอลัมน์จำนวนมากหรือมีหลายภาษา
  • ยากที่จะเพิ่มภาษาใหม่ การเพิ่มภาษาใหม่จำเป็นต้องเปลี่ยนโครงสร้างข้อมูล สำหรับแต่ละตารางที่มีเนื้อหาหลายภาษา
  • เรียกใช้ข้อมูลยาก SQL ที่เขียนยากจะสะท้อนให้เห็นในเวลาการพัฒนาและอาจทำให้ต้องเสียค่าใช้จ่ายในการบำรุงรักษา

3. แบบหลายแถวตามจำนวนภาษา

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

Multirow Approach
// ตัวอย่าง SQL
SELECT * FROM Products WHERE lang = "th" AND id = 1
ข้อดี
  • ความเรียบง่าย ง่ายต่อการนำไปใช้
  • สืบค้นง่าย ไม่จำเป็นต้อง JOIN
ข้อเสีย
  • ดูแลรักษายาก ทุกคอลัมน์ที่ไม่ได้แปลจะต้องเปลี่ยนในทุกแถวสำหรับแต่ละภาษา เช่น การเปลี่ยนแปลงราคาสำหรับผลิตภัณฑ์เดียวจำเป็นต้องมีการดำเนินการนี้ซ้ำสำหรับทุกภาษา
  • เพิ่มภาษาใหม่ได้ยาก ต้องมีการแทรกซ้ำสำหรับแต่ละภาษา
  • เนื้อหาที่ซ้ำกัน คุณจะมีเนื้อหาที่ซ้ำกันจำนวนมากสำหรับทุกคอลัมน์ที่ไม่ได้รับการแปล

4. แบบเพิ่ม 1 ตารางสำหรับการแปลภาษาทั้งหมด

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

Single Translation Table Approach
// ตัวอย่าง SQL
SELECT Products.*, title_translate.value as title, detail_translate.value as detail FROM Products JOIN Translate title_translate ON Products.title_translate_id = title_translate.id JOIN Translate detail_translate ON Products.detail_translate_id = detail_translate.id WHERE title_translate.lang = "th" AND detail_translate.lang  = "th" AND Products.id  = 1 SELECT Blog.*, title_translate.value as title, detail_translate.value as detail FROM Blog
JOIN Translate title_translate ON Blog.title_translate_id = title_translate.id
JOIN Translate detail_translate ON Blog.detail_translate_id = detail_translate.id
WHERE title_translate.lang = "th"
AND detail_translate.lang  = "th"
AND Blog.id  = 1
ข้อดี
  • การทำให้เป็นมาตรฐานที่เหมาะสม ดูเหมือนเป็นแนวทางที่สะอาดและสัมพันธ์กัน
  • เพิ่มภาษาใหม่ได้ง่าย ไม่ต้องเปลี่ยนโครงสร้างข้อมูล
  • การแปลทั้งหมดในที่เดียว ฐานข้อมูลที่อ่านได้/บำรุงรักษาได้
ข้อเสีย
  • การเรียกข้อมูลที่ซับซ้อน จำเป็นต้องมีการรวมหลายรายการเพื่อดึงคำอธิบายผลิตภัณฑ์ที่ถูกต้อง
  • ดูแลรักษายาก การเรียกข้อมูลที่ซับซ้อนมากเกินไปในการดำเนินการทั้งหมด การแทรก การลบ และการอัปเดต
  • การแปลทั้งหมดในที่เดียว ตารางที่หายไปหนึ่งตารางนำไปสู่ปัญหากับตารางทั้งหมด

5. แบบเพิ่มตารางการแปลภาษาสำหรับตารางนั้นๆ

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

Additional Translation Table Approach
// ตัวอย่าง SQL
SELECT * Products
JOIN ProductsTranslate ON Products.id = ProductsTranslate.product_id
WHERE lang = "th" AND Products.id = 1
ข้อดี
  • การทำให้เป็นมาตรฐานที่เหมาะสม ดูเหมือนเป็นแนวทางที่สะอาดและสัมพันธ์กัน
  • เพิ่มภาษาใหม่ได้ง่าย ไม่ต้องเปลี่ยนโครงสร้างข้อมูล
  • ชื่อคอลัมน์ ไม่ต้องใช้ "_lang" ต่อท้ายหรืออย่างอื่น
  • สืบค้นง่าย ต้องการ JOIN เดียวเท่านั้น
ข้อเสีย
  • อาจเพิ่มจำนวนตารางเป็นสองเท่า คุณต้องสร้างตารางการแปลสำหรับตารางทั้งหมดของคุณที่มีคอลัมน์ที่ต้องแปลภาษา
 

สรุป

วีธีในการออกแบบ Multi-Language Database ที่อยากจะแนะนำก็คือวิธีสุดท้ายจากทั้งหมดข้างต้น คุณจะเลือกทำแบบไหนหรือไม่เลือกวิธีใดเลยในที่นี้ก็ขึ้นอยู่กับความต้องการของคุณ อาจจะมีการออกแบบในแบบอื่นๆ ก็หวังว่าทั้งหมดนี้จะเป็นประโยชน์กับโปรเจคของคุณ