2009-08-24 43 views
8

Tôi có một số bảng cơ sở dữ liệu chứa các cột namedescription cần được bản địa hóa. nỗ lực ban đầu của tôi lúc thiết kế một schema DB rằng sẽ hỗ trợ này là một cái gì đó như:Cơ sở dữ liệu địa phương hóa

product 
------- 
id 
name 
description 


local_product 
------- 
id 
product_id 
local_name 
local_description 
locale_id 


locale 
------ 
id 
locale 

Tuy nhiên, giải pháp này đòi hỏi một local_ bảng mới cho mỗi bảng có chứa name và mô tả cột đòi hỏi localization. Trong một nỗ lực để tránh chi phí này tôi đã thiết kế lại schema để chỉ một bảng duy nhất localization là cần thiết

product 
------- 
id 
localization_id 


localization  
------- 
id  
local_name 
local_description 
locale_id 


locale 
------ 
id 
locale 

Dưới đây là một ví dụ về các dữ liệu đó sẽ được lưu trữ trong schema này khi có 2 bảng (sản phẩm và quốc gia) yêu cầu nội địa hóa:

nước sản phẩm

id,  localization_id 
----------------------- 
1,  5 

id,  localization_id 
----------------------- 
1,  2 

nội địa hóa

id,  local_name, local_description,  locale_id 
------------------------------------------------------ 
2,  apple,  a delicious fruit,  2 
2,  pomme,  un fruit délicieux, 3 
2,  apfel,  ein köstliches Obst, 4 
5,  ireland,  a small country,  2 
5,  irlande,  un petite pay,   3 

locale

id,  locale 
-------------- 
2,  en 
3,  fr 
4,  de 

Chú ý rằng các khóa chính hợp chất của bảng localization(id, locale_id), nhưng chìa khóa ngoại trong bảng product chỉ đề cập đến yếu tố đầu tiên của hợp chất PK này. Điều này có vẻ như 'một điều xấu' từ POV bình thường hóa.

Có cách nào tôi có thể khắc phục sự cố này hay không, liệu có một lược đồ hoàn toàn khác hỗ trợ bản địa hóa mà không tạo bảng riêng cho từng bảng có thể bản địa hóa không?

Cập nhật: Một số người trả lời đã đề xuất giải pháp yêu cầu tạo bảng riêng cho từng bảng có thể bản địa hóa. Tuy nhiên, đây chính xác là những gì tôi đang cố gắng tránh. Lược đồ tôi đã đề xuất ở trên hầu như giải quyết được vấn đề cho sự hài lòng của tôi, nhưng tôi không hài lòng với thực tế rằng các khóa ngoài localization_id chỉ tham chiếu đến một phần của khóa chính tương ứng trong bảng localization.

Cảm ơn, Don

+1

"nhưng tôi không hài lòng về thực tế là các khóa ngoại ngữ localization_id chỉ tham chiếu đến một phần của khóa chính tương ứng trong bảng bản địa hóa". Tôi không thấy vấn đề, có một đến nhiều mối quan hệ từ sản phẩm đến nội địa hóa, cấu trúc cơ sở dữ liệu theo yêu cầu, bạn đã tìm thấy một giải pháp tốt. –

+0

Điều này sẽ được đăng trên http://dba.stackexchange.com/ –

Trả lời

1

Cách đúng, tôi cảm thấy, sẽ tạo ra bảng phụ, nhưng sau đó đi bước thêm và loại bỏ tất cả các nguồn lực ngôn ngữ cụ thể từ bảng đầu tiên.

Vì vậy, bạn muốn có:

sản phẩm

id 
-name removed 
-description removed 

nội địa hóa sản phẩm

productid, locale_id, name, description 
------------------------------------------------------ 
1,   3,   pomme, un fruit délicieux 
1,   4,   apfel, ein köstliches Obst 
1,   1,   apple, a delicious fruit 

locale

id,  locale 
-------------- 
1,  en 
3,  fr 
4,  de 
+0

Giản đồ này sẽ không hoạt động khi có nhiều hơn một bảng chứa nội dung có thể bản địa hóa –

+0

Bạn sẽ cần thêm một bảng cho mỗi nội dung có thể nội địa hóa. Tôi không nghĩ rằng bạn có thể nhận được xung quanh đó. Một số bảng địa phương có thể không có tên hoặc mô tả, bạn thấy hoặc có thể có nhiều trường yêu cầu bản dịch hơn. Điều này tất nhiên phá vỡ thực hành tốt nhất cho bình thường. Sử dụng các bảng phụ. – DanDan

+0

Trong trường hợp này, có thể giả định rằng * mọi * bảng có thể bản địa hóa sẽ chỉ yêu cầu tên và mô tả được bản địa hóa –

3

Tôi nghĩ nó ổn. Bạn đang mô tả mối quan hệ một-nhiều giữa sản phẩm và văn bản bản địa hóa của sản phẩm.

Tôi tự hỏi liệu bạn có nên bản địa hóa tiếng Anh thay vì hủy chuẩn hóa nó trong bảng sản phẩm hay không.

+0

Tôi đã sửa đổi lược đồ để kết hợp đề xuất của bạn –

+2

Toàn bộ nội địa hóa là có một -many mối quan hệ giữa "điều" và tên. Vì vậy, nó tự nhiên sau đó một tham chiếu trong bảng "điều" không thể là một khóa chính hoàn chỉnh cho bảng bản địa hóa, bởi vì điều đó sẽ hạn chế mối quan hệ với một-một. Cách phổ biến hơn để thực hiện mối quan hệ nhiều người một là đăng số nhận dạng của "một" vào cuối "nhiều", nhưng bạn có vấn đề khi làm điều đó ở đây, vì bảng bản địa hóa sẽ phải tham chiếu nhiều bảng khác nhau, tạo một tham chiếu khóa ngoài được xác định sai, lỏng lẻo. – Jay

1

Nếu tôi hiểu đúng, vấn đề của bạn chỉ là vì bạn muốn sử dụng cùng một bản địa hóa languale cho tên và mô tả trong nhiều hơn một bảng. Trong trường hợp như vậy, bạn không thể thêm prod_id vào bảng bản địa hóa. Một vấn đề nữa trong thiết kế của bạn là nó không thể xử lý nhiều bản địa hóa ngôn ngữ cho cùng một sản phẩm một cách thanh lịch. Bạn có thể tinh chỉnh nó để hoạt động:

Nếu tên và mô tả là các trường duy nhất yêu cầu bản địa hóa, bạn có thể thực hiện các thao tác sau.

Sản phẩm (ID, tên, mô tả, tanslation_row_id)

Product_translations (ID, tên, mô tả, lang_id, translation_id)

Các translation_row_id sẽ trỏ chính nước ngoài để Product_translations.ID Các translation_id sẽ, tuy nhiên chỉ một bản ghi cha mẹ trong cùng một bảng sẽ phục vụ như một hồ sơ chung cho tất cả các bản ghi ngôn ngữ cụ thể.

Ví dụ ghi

sản phẩm

(ID, name, description, translation_row_id) 
(p1, apples,a red fruit, tr1) 
(p2, mango, a yellow fruit, tr2) 

Product_translations

(ID, name, description, lang_id, translation_id) 
(tr1, apples, a red fruit, ENU, null) 
(tr2, mango, a yellow fruit, null) 
(tr3, pomme,un fruit rouge, FRA,tr1) 
(tr4, mangue,a yellow fruit, SPA,tr2) 

Cho một mã ngôn ngữ, bạn có thể trích xuất các tên và mô tả các giá trị bằng cách sử dụng truy vấn foll SQL

select T.name, T.description 
from product_translations T 
where T.translation_id = 
    (select T2.ID 
     from Product P,Product_translations T2 
     where P.translation_row_id = t2.ID 
    ) 
    and T.lang_id = '&langID'; 

Lưu ý quan trọng: Tôi giả định rằng bảng sản phẩm có nhiều thuộc tính hơn mà không cần bản dịch này. '& langID' là thông số cho truy vấn SQL sẽ yêu cầu người dùng mã ngôn ngữ do mình chọn

+0

Đề xuất tuyệt vời, tôi có thể dùng thử. Tuy nhiên, tôi có lẽ sẽ loại bỏ tên và mô tả từ các bảng Product (và các localizable) khác, vì nó có vẻ là thừa. Ngoài ra, bảng product_translations nên được gọi là cái gì đó chung chung hơn như 'bản dịch', bởi vì trong thực tế nó sẽ chứa các quốc gia, sản phẩm, v.v. –

2

Tôi thích ý tưởng này, nhưng sẽ đi theo một hướng khác và có mục nhập nội địa hóa cho mỗi cột được dịch:

nước

id,  localization_id 
----------------------- 
1,  5 

sản phẩm

id,  name_locale_id, description_locale_id 
---------------------------------------------- 
1,  2,    8 

nội địa hóa

id,  locale_id, value 
------------------------------------------------------ 
2,  2    apple 
2,  3    pomme 
2,  4    apfel 
5,  2    ireland 
5,  3    irlande 
8,  2    a delicious fruit 
8,  3    un fruit délicieux 
8,  4    ein köstliches Obst 
9,  2    a small country 
9,  3    un petite pay 

locale

id,  locale 
-------------- 
2,  en 
3,  fr 
4,  de 

Các PK của nội địa hóa là (id, LOCALE_ID). Không có vấn đề gì mà id cũng là một tham chiếu FK trong một số bảng khác. Bạn có thể thêm một PK thay thế nếu bạn muốn, miễn là bạn vẫn có một chỉ mục duy nhất trên (id, locale_id).

Điều tốt đẹp về điều này là bảng bản địa hóa và nó hoạt động với bất kỳ bảng nào trong lược đồ của bạn, bất kể trường nào có (bạn không bị giới hạn cả tên và mô tả của bất kỳ thứ gì được bản địa hóa) . Nhược điểm là hiệu suất tiềm năng khi sử dụng bảng bản địa hóa - mặc dù có khả năng bạn chỉ cần lưu toàn bộ nội dung cho một locale_id, vì vậy khi bạn tìm kiếm các mục bạn chỉ cần tìm id đã cho (vì bộ đệm của bạn là được khóa dựa trên ngôn ngữ đã có).

Bạn cũng có thể xem xét để lại trong trường mặc định và tên mô tả trong bảng sản phẩm, sẽ được sử dụng trong trường hợp thiếu mục nhập cho ngôn ngữ hiện tại hoặc khi nhập, người dùng không chỉ định ngôn ngữ. Đây cũng là trường hợp nếu bạn đang chuyển một ứng dụng hiện có, bạn đã có giá trị ở đó (không có thông tin về miền địa phương).

Các vấn đề liên quan