Thiết kế CSDL đa ngôn ngữ với MySQL

Web đa ngôn ngữ không còn xa lạ gì với công nghệ web 2.0 nữa, không chỉ website lớn mà cả những website nhỏ và trung bình cũng có nhu cầu sử dụng đa ngôn ngữ để giúp cho người dùng có thể đọc được, điều này giúp cho website giữ được lượng khách truy cập và sẽ xuất hiện nhiều khách hàng tiềm năng hơn.

1. Web đa ngôn ngữ là gì?

Web đa ngôn ngữ là web có thể xem ở nhiều ngôn ngữ khác nhau, đây là dạng web dành cho những trang tin tức, thương mại điện tử hoặc những website muốn đánh vào nhiều quốc gia khác nhau trên thế giới.

Để xây dựng một website đa ngôn ngữ thì có hai vấn đề chính mà lập trình viên (Coder) và khách hàng (Customer) cần phải chú ý như sau:

  • Khách hàng: Đòi hỏi phải dịch hầu hết các bài viết trong website nên tốn nhiều thời gian và tiền bạc. Tuy nhiên nếu khách hàng muổn website chỉ dịch một số bài thôi thì điều này cần phải bàn bạc thêm với Coder để họ xử lý cho bạn.
  • Lập trình viên: Bạn phải dựa vào yêu cầu của khách hàng và từ đó phân tích được độ lớn của dự án mà chọn giải pháp tối ưu nhất có thể. Thông thường những website nhỏ thì ta sử dụng PHP và MySQL để xây dựng luôn.

Nói chung quy lại cho dễ hiểu thì trong bài này mình sẽ hướng dẫn các bạn cách thiết kế CSDL đơn giản cho một website đa ngôn ngữ.

2. Cách thiết kế CSDL website đa ngôn ngữ

Như mình phân tích ở trên thông thường có hai dạng yêu cầu web đa ngôn ngữ đó là:

  • Web dịch toàn bộ bài
  • Web chỉ dịch một số bài

Dịch toàn bộ bài viết

Trường hợp này ta có một số cách thiết kế như sau:

Cách 1: Mỗi table ta sẽ lưu số trường bằng tương ứng với số ngôn ngữ. Ví dụ website làm 3 ngôn ngữ thì mình lưu trường titletitle_en, title_vi, title_cn. Như vậy nếu mở rộng thì sẽ rất khó khăn vì ta phải vào hệ thống thêm từng field.

Cách 2: Mỗi field ta sẽ lưu dạng thẻ xml dạng <lang>nội dung</lang>. Ví dụ <vi>Nội dung</vi><en>Content</en>. Với cách lưu này khi mở rộng ta không cần phải bổ sung field. Tuy nhiên có hai điểm yếu, thứ nhất nếu dữ liệu quá nhiều vượt quá mức lưu trữ của MySQL thì sẽ mất dữ liệu, thứ hai tuy nhiên ban phải sử dụng thêm PHP để lập trình thật chặc chẽ (dùng Regular Expression để bóc tách).

Cách 3: Mỗi table ta sẽ lưu trữ thêm một table đa ngôn ngữ và một table liên kết nữa. Ví dụ có table News(id, titlte, content, status) với hai field titlecontent là đa ngôn ngữ thì ta bổ sung thêm table language như hình sau: 

  

Với cách lưu trữ này khi ban thêm mới một ngôn ngữ thì chỉ cần bổ sung dữ liệu vào bảng Language.

Dịch một số bài viết 

Với yêu cầu này thì hơi rườm rà nên mình đưa ra một cách đơn giản để các bạn tham khảo.

Chúng ta chỉ cần một bảng và trong bảng đó sẽ có một số field liên hệ với nhau như sau: News (id, title, content, language, parent_id)

Giả sử mình chọn ngôn ngữ tiếng Việt làm ngôn ngữ chính thì khi thêm một bài viết mới nếu bài này dành cho tiếng Việt thì ta không cần chọn parrent_id, ngược lại nếu là ngôn ngữ khác thì ta phải chọn parent_id (chính là bài tiêng Việt).

Lúc này dư liệu như sau:

Như vậy ta phải dựa vào ha field languageparrent_id đẻ xử chuyển ngôn ngữ cho thật chính xác.

Lưu ý: Để xử lý nhuần nhuyễn và chính xác các cách trên thì đòi hỏi ban phải thành thạo PHP, MySQL, Javascript để xử lý phía backend lẫn frontend.

3. Lời kết

Như vậy trong bài này mình đã giới thiệu web đa ngôn ngư là gì và đưa ra một số cách lưu trữ CSDL tương ứng cho từng trường hợp cụ thể. Tuy nhiên đó là ý kiến riêng của bạn thân mình nên có thể nó không hay lắm, vì vậy nếu bạn có cách khác hay hơn thì xin hãy bổ sung bằng cách bình luận bên dưới để mình có thể đưa vào bài viết giúp hoàn thiện hơn.

 

Hãy để lại link bài viết gốc khi chia sẻ bài viết này, mình sẽ report DMCA với những website lấy nội dung mà không để nguồn hoặc copy bài với số lượng lớn.

Nguồn: freetuts.net

Profile photo of adminTheHalfHeart

TheHalfHeart

Có sở thích viết tuts nên đã từng tham gia viết ở một số diễn đàn, đến năm 2014 mới có điều kiện sáng lập ra freetuts.net. Sinh năm 90 và có 1 vợ 2 con, thích ca hát và lập trình.

ĐĂNG BÌNH LUẬN: Đăng câu hỏi trên Group Facebook để được hỗ trợ nhanh nhất.