Thiết kế cơ sở dữ liệu cho web đa ngôn ngữ
Bài viết này dựa trên kinh nghiệm cá nhân và không hẳn là cách tốt nhất. Xây dựng website đa ngôn ngữ có nhiều vấn đề, 1 trong số đó là cách lưu trữ nội dung trong csdl cho từng ngôn ngữ, có cách nào tối ưu hơn các bạn tham gia góp ý trao đổi nhé
1. Hướng tiếp cận dạng cột
Cách này phổ biến, cơ bản là tạo ra nhiều cột lưu trữ nội dung từng ngôn ngữ
table pages
— id (uniqueidentified)
— title_vi (nvarchar)
— title_en (nvarchar)
— content_vi (ntext)
— content_en (ntext)
Cách này truy vấn bằng cách tự động chọn các cột theo ngôn ngữ
SELECT id, title_vi AS title, content_vi AS content FROM pages
Hoặc có thể chọn tất cả các cột và lấy đúng cột theo ngôn ngữ
string title = (string)dataReader["title_" + Session["currentLanguage"]];
Thuận lợi
– Nó không trùng thông tin vì chĩ có 1 dòng cho mỗi mẫu tin và chỉ có các cột ngôn ngữ được nhân bản
– Dễ cài đặt
Bất lợi
– Khó duy trì. Dù dễ dàng với 2-3 ngôn ngữ nhưng không thích hợp khi có nhiều ngôn ngữ hoặc nhiều cột
– Khó thêm ngôn ngữ mới
2. Hướng tiếp cận nhiều dòng
Tương tự như cách ở trên, cách này tạo ra nhiều dòng thay vì nhân bản các cột theo ngôn ngữ
table pages
— id (uniqueidentified)
— language_id (smallint)
— title (nvarchar)
— content (nvarchar)
Cách này sẽ có 3 dòng cho cùng 1 trang nếu có 3 ngôn ngữ
Thuận lợi
– Dễ thêm ngôn ngữ mới
Bất lợi
– Nhiều nội dung trùng tại các cột chứa nội dung chung không cần chuyển ngữ
3. Hướng tiếp cận dạng bảng
Cách này phức tạp hơn 2 cách trên, nhưng thích hợp cho website động, có nhiều ngôn ngữ và có ý định thêm ngôn ngữ mới dễ dàng
table languages
— id (smallint)
— name (nvarchar)
table pages
— id (uniqueidentified)
— language_id (smallint)
— title (int fk)
— content (int fk)
table translation
— id (uniqueidentified)
table translation_entry
— translation_id (uniqueidentified)
— language_id (smallint)
— content (ntext)
Thuận lợi
– Dễ dàng thêm ngôn ngữ mới
Bất lợi
– Truy vấn nhiều bảng để lấy được nội dung
– Tất cả nội dung chuyển ngữ nằm cùng bảng
– Trông hơi khó làm việc và duy trì
4. Hướng tiếp cận dạng bảng 2
Đây là 1 biến thể của cách tiếp cận trên để dễ dàng làm việc và duy trì
Thay vì chỉ có 1 bảng dùng chuyển ngữ cho tất cả các bảng khác, bây giờ sẽ có 1 bảng dùng chuyển ngữ tưng ứng với 1 bảng. Di chuyển các cột cần chuyễn ngữ sang bảng dùng chuyển ngữ, còn lại các cột dùng chung (các cột không cần chuyển ngữ)
table languages
— id (smallint)
— name (nvarchar)
table pages
— id (uniqueidentified)
table pages_translation
— id (uniqueidentified)
— page_id (uniqueidentified)
— language_id (smallint)
— title (nvarchar)
— content (ntext)
SELECT * FROM pages JOIN pages_translation ON pages.id = pages_translation.page_id WHERE languages_id='1'
Thuận lợi
– Dễ thêm ngôn ngữ mới
– Dễ truy vấn
– Tên các cột được giữ nguyên
Bất lợi
– Tạo ra nhiều bảng chuyển ngữ tương ứng với các bảng
Kết luận
Chắc chắn có nhiều phương pháp khác nhau tạo nên website đa ngôn ngữ. Các giải pháp trên là ý kiến dựa vào kinh nghiệm cá nhân và cũng là phù hợp với các website đang làm
Dạng chuẫn khi thiết kế csdl vẫn chưa được bàn đến trong các phương pháp trên, sẽ có 1 bài viết như thế.
Cuối cùng, phương pháp tốt nhất là phương pháp phù hợp nhất với từng website, phù hợp nhất với cách làm việc và duy trì của bạn
Nếu bạn có hoặc tìm thấy cách nào khác, vui lòng chia sẽ với tôi và mọi người!
Tham khảo thêm
http://www.ibm.com/developerworks/web/library/wa-dbdsgn2.html
http://stackoverflow.com/questions/929410/what-is-best-practices-for-multilanguage-database-design