2012-12-13 14 views
5

Tôi biết hầu hết mọi người sử dụng cách tiếp cận bên dưới và tạo bảng dịch cho bảng cụ thể cần bản dịch nhưng điều này có thể dẫn đến tải bảng.Dịch ngôn ngữ cho các bảng

CREATE TABLE Product 
(
    Product_id 
    ,ProductTrans_id -- FK 
) 

CREATE TABLE ProductTranslation 
(
    ProductTrans_id 
    ,Product_id 
    ,Name 
    ,Descr 
    ,lang_code 
) 

Phương pháp dưới đây có thể thực hiện được không? Giả sử bạn có nhiều bảng có nhiều hơn 1 cột cần dịch. Bạn có thể làm như sau nad giữ tất cả các bản dịch trong 1 bảng? Tôi cho rằng cái bàn này sẽ phát triển rất lớn theo thời gian.

CREATE TABLE translation_entry (
      translation_id  int, 
      language_id   int, 
      table_name   nvarchar(200), 
      table_column_name  nvarchar(200), 
      table_row_id   bigint, 
      translated_text  ntext 
     ) 

    CREATE TABLE translation_language (
      id int, 
      language_code CHAR(2) 
     ) 

Vì vậy, sử dụng phương pháp thứ hai bạn sẽ nhận được các văn bản như vậy

select 
    product.name 
    ,translation_entry.translated_text 
from product 
inner join translation_entry on product.product_id = translation_entry.table_row_id 
and translation_entry.table_name = 'Product' and translation_entry.table_column_name = 'Name' 
and language_id = 3 
+1

Cách tiếp cận thứ 2 có vẻ như rất nhiều chi phí và sẽ liên quan đến nhiều lần tìm nạp cột dịch của một sản phẩm duy nhất .. Nếu tôi hiểu chính xác ..? 1 vì nó là một câu hỏi hay! –

+0

Tôi đoán một cách tiếp cận tốt sẽ là đầu tiên xem xét các truy vấn của bạn sẽ trông như thế nào .. sẽ yêu cầu thiết kế bảng –

+0

Trong phương pháp thứ 2 bạn có thể lọc trên TableName và ColumnName và sau đó liên kết thông qua table_row_id. Có thể truy vấn chậm. Chỉ cần suy nghĩ về một cách để làm điều này mà không đòi hỏi một sự thay đổi lược đồ khi một bản dịch là cần thiết cho một bảng mới hoặc cột, vv – davey

Trả lời

2

Tôi không chắc chắn lý do tại sao bạn lo ngại về số lượng bảng: có bảng ít không tự động có nghĩa là cơ sở dữ liệu của bạn nhỏ hơn, hiệu quả hơn hoặc được thiết kế tốt hơn. Đặc biệt là nếu giảm số lượng bảng làm tăng độ phức tạp của các truy vấn của bạn, tôi sẽ rất cẩn thận khi thực hiện nó.

Dù sao, tôi sẽ đi cho một bảng dịch cho mỗi bảng 'cơ sở'. Lý do chính là giải pháp thứ hai của bạn không linh hoạt: nếu khóa chính không phải là một số nguyên thì nó trở nên vô cùng khó thực hiện và sử dụng. Việc truy vấn bản dịch cũng phức tạp hơn, và tùy thuộc vào kích thước của bảng và dữ liệu, có thể khó lập chỉ mục nó một cách hiệu quả.

Không rõ lý do bạn có một số TranslationID trên bảng Products; thường là mối quan hệ là cách khác xung quanh:

create table dbo.Products (
    ProductCode char(10) not null primary key, 
    ProductName nvarchar(50) not null, 
    ProductDescription nvarchar(100) not null, 
    -- other columns 
) 

create table dbo.ProductsTranslations (
    ProductCode char(10) not null, 
    LanguageCode char(2) not null, 
    ProductName nvarchar(50) not null, 
    ProductDescription nvarchar(100) not null, 
    -- other translations 
    constraint FK1 foreign key (ProductCode) 
     references dbo.Products (ProductCode), 
    constraint FK2 foreign key (LanguageCode) 
     references dbo.Languages (LanguageCode), 
    constraint PK primary key (ProductCode, LanguageCode) 
) 

Tùy thuộc vào công cụ của bạn và quá trình triển khai, bạn có thể muốn tạo ra bảng dịch trực tiếp từ những cơ sở như một phần của cơ sở dữ liệu xây dựng của bạn. Và bạn có thể sử dụng các khung nhìn để cung cấp một phiên bản thuận tiện, được dịch đầy đủ của bảng cơ sở.

Một câu hỏi thú vị là ngôn ngữ nào được sử dụng cho các cột trong Products và nếu chúng có thể được sử dụng trực tiếp khi không yêu cầu dịch. Đề xuất của tôi là tất cả mã sản xuất phải chuyển một tham số ngôn ngữ và lấy văn bản từ bảng ProductsTranslations, ngay cả đối với tiếng Anh (hoặc bất kỳ ngôn ngữ công ty nội bộ nào của bạn). Bằng cách đó bạn có thể chắc chắn rằng tất cả các tên 'chính thức' được tìm thấy trong cùng một bảng và các cột trên bảng cơ sở ở đó để rõ ràng và đầy đủ của mô hình dữ liệu cũng như sự tiện lợi của nhà phát triển và (có thể) sử dụng nội bộ báo cáo, v.v.

+0

Cảm ơn Pondlife, tôi đã chỉ nhìn vào những cách khác để thực hiện một bảng ngôn ngữ. Thiết kế bạn đã mô tả dường như là cách tiếp cận tốt nhất. – davey