Çok dilli veritabanı tasarımı için en iyi uygulamalar nelerdir? [kapalı]


193

Çok dilli veritabanı oluşturmanın en iyi yolu nedir? Her tablo için yerelleştirilmiş tablo oluşturmak için tasarım ve sorgulama karmaşık hale getirmek, diğer durumlarda her dil için sütun eklemek basit ama dinamik değil, lütfen kurumsal uygulamalar için en iyi seçimin ne olduğunu anlamama yardımcı olun



3
Bunu benim için çok yararlı buldum:
MySQL'de Çok Dilli

Yanıtlar:


223

Yaptığımız her çok dilli nesne için iki tablo oluşturmak.

Örneğin, ilk tablo yalnızca dilden bağımsız veriler (birincil anahtar, vb.) İçerir ve ikinci tablo, yerelleştirilmiş verileri artı dilin ISO kodunu içeren her dil için bir kayıt içerir.

Bazı durumlarda, bir DefaultLanguage alanı ekleriz, böylece belirli bir dil için yerelleştirilmiş veri yoksa bu dile geri dönebiliriz.

Misal:

Table "Product":
----------------
ID                 : int
<any other language-neutral fields>


Table "ProductTranslations"
---------------------------
ID                 : int      (foreign key referencing the Product)
Language           : varchar  (e.g. "en-US", "de-CH")
IsDefault          : bit
ProductDescription : nvarchar
<any other localized data>

Bu yaklaşımla, gerektiği kadar çok dil işleyebilirsiniz (her yeni dil için ek alan eklemek zorunda kalmadan).


Güncelleme (2014-12-14): Çok dilli verileri bir uygulamaya yüklemek için kullanılan uygulama hakkında bazı ek bilgiler için lütfen bu cevaba göz atın .


15
dilde tarafsız olan tek alan id ise ne olur? ve bir satır eklerken yabancı anahtar referansını tam olarak nasıl eklersiniz?
Timo Huovinen

4
Çok dilli bir CMS için bir veritabanı şeması tasarlıyorum ve bu soruyu kafamda da vardı. Bu cevabı görmeden önce bu yaklaşımı seçtim! Bu cevap için teşekkürler!
Patrick Manser

5
Burada dikkat edilmesi gereken bir nokta, bu tabloda PK bulunmayacağı veya ID'nin ve Dil'in bileşik PK olması gerektiğidir. Ya bu, ya da bir kimlik olarak bir ProductTranslationId alanı eklemeniz gerekir.
Daniel Lorenz

1
@Luca: Sorunuzu yanıtladı, verileri yüklemek için hangi uygulamaları kullandığımı gösterdim.
M4N

1
@ AarónGutiérrez Eh, ne kadar tuhaf, idD adında tek bir sütun ile bir tablo oluşturmak . Açıklamak için, her idbir sen iki tablo almak böylece, bir ilişkisel tabloda herhangi bir dilden kelime eklemek hangi anlam temsil meaning(id) ve word(id, meaning_id), idiçinde wordmasaya, kelime kimliği temsil idiçinde meaningtemsil evrensel olan anlam.
Timo Huovinen

18

Martin tarafından gönderilen cevabı öneriyorum.

Ancak, sorgularınızın çok karmaşık hale gelmesinden endişe duyuyorsunuz:

Her tablo için yerelleştirilmiş tablo oluşturmak için tasarım ve sorgulama karmaşık hale getiriyor ...

Yani şöyle düşünebilirsiniz, bunun gibi basit sorgular yazmak yerine:

SELECT price, name, description FROM Products WHERE price < 100

... böyle sorguları yazmaya başlamanız gerekir:

SELECT
  p.price, pt.name, pt.description
FROM
  Products p JOIN ProductTranslations pt
  ON (p.id = pt.id AND pt.lang = "en")
WHERE
  price < 100

Çok hoş bir bakış açısı değil.

Ancak manuel olarak yapmak yerine, özel yerelleştirme işaretlemenizi içeren SQL'i önceden ayrıştıran ve veritabanına göndermeniz gereken gerçek SQL'e dönüştüren kendi veritabanı erişim sınıfınızı geliştirmelisiniz.

Bu sistemi kullanmak şöyle görünebilir:

db.setLocale("en");
db.query("SELECT p.price, _(p.name), _(p.description)
          FROM _(Products p) WHERE price < 100");

Ve bundan daha iyisini yapabileceğine eminim.

Anahtar tablo ve alan adlarını aynı şekilde adlandırmaktır.


diğer soru, ürün için bir iş nesnesi oluşturmak mı? ya da iki oluşturmak için ... ilk olarak bu öğeyle çalışmak kolay, 2. yazmak kolay CMS
Arsen Mkrtchyan

14

Bu tür bir yaklaşımın benim için işe yaradığını düşünüyorum:

Ürün Ürün Detay Ülkesi
========= ================== =========
ProductId ProductDetailId CountryId
- etc - ProductId ÜlkeAdı
            CountryId Dili
            ProductName - vb -
            Ürün Açıklaması
            - vb -

ProductDetail tablosu, desteklemek istediğiniz dillerde tüm çevirileri (ürün adı, açıklama vb. İçin) içerir. Uygulamanızın gereksinimlerine bağlı olarak, bölgesel dilleri kullanmak için Ülke tablosunu da kırmak isteyebilirsiniz.


Şu anda üzerinde çalıştığım bir proje için de aynı yaklaşımı seçtim çünkü farklı yerel ayarlarım birim sistemleri ve kullanıcılara gösterilecek önlemler hakkında çok özel bilgiler içeriyor.
califrench

8
Ülke ve dil (yerel ayarlar) farklı şeylerdir. Ve ISO dil kodları doğal anahtarlardır, dilden ülkeye gereksiz katılımı ortadan kaldırırsınız.
gavenkoa

10

Bir sonraki yaklaşımı kullanıyorum:

Ürün

ProductID SiparişNo, ...

Ürün bilgisi

ÜrünKimliği Başlık Adı DilKimliği

Dil

LanguageID İsim Kültürü, ....


2

Martin'in çözümü benimkine çok benziyor, ancak istenen çeviri bulunmadığında varsayılan açıklamaları nasıl ele alırsınız?

Bu, her alan için bir IFNULL () ve başka bir SELECT deyimi gerektirir mi?

Varsayılan çeviri, aynı tabloda saklanır; burada "isDefault" gibi bir işaret, geçerli dil için hiçbirinin bulunamaması durumunda açıklamanın varsayılan açıklama olup olmadığını gösterir.


1
@GorrillaApe: İstediğiniz dil bulunamazsa, varsayılan dile nasıl geri dönüleceğine ilişkin bir örnek için bu cevaba bakın: stackoverflow.com/a/27474681/19635
M4N
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.