Thiết kế cơ sở dữ liệu cho web đa ngôn ngữ

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

Mục nhập này đã được đăng trong Blog. Đánh dấu trang permalink.