다국어 데이터베이스 디자인에 대한 모범 사례는 무엇입니까? [닫은]


193

다국어 데이터베이스를 만드는 가장 좋은 방법은 무엇입니까? 모든 테이블에 대해 지역화 된 테이블을 만들려면 디자인 및 쿼리가 복잡해집니다. 다른 경우에는 각 언어에 대한 열을 추가하는 것이 간단하지만 역동적이지 않으므로 엔터프라이즈 응용 프로그램에 가장 적합한 선택을 이해하도록 도와주세요.



3
나는 이것이 매우 유용하다는 것을 알았다 : MySQL의 다국어 데이터베이스 디자인
— Siamak A.Motlagh

답변:


223

우리가하는 일은 각 다국어 개체에 대해 두 개의 테이블을 만드는 것입니다.

예를 들어 첫 번째 테이블에는 언어 중립적 데이터 (기본 키 등) 만 포함되고 두 번째 테이블에는 현지화 된 데이터와 해당 언어의 ISO 코드가 포함 된 언어 당 하나의 레코드가 포함됩니다.

경우에 따라 DefaultLanguage 필드를 추가하여 지정된 언어에 대해 현지화 된 데이터를 사용할 수없는 경우 해당 언어로 대체 할 수 있습니다.

예:

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>

이 방법을 사용하면 새로운 언어마다 필드를 추가 할 필요없이 필요한만큼 언어를 처리 할 수 ​​있습니다.


업데이트 (2014-12-14) : 다국어 데이터를 응용 프로그램에로드하는 데 사용되는 구현에 대한 추가 정보 는 이 답변을 참조하십시오 .


15
언어 중립적 인 유일한 필드가 ID 인 경우 어떻게해야합니까? 행을 삽입 할 때 외래 키 참조를 정확히 어떻게 삽입합니까?
— Timo Huovinen

4
다국어 CMS에 대한 데이터베이스 체계를 설계하고 있었고이 질문도 머릿속에 들었습니다. 이 답변을보기 전에이 접근법을 선택했습니다! 이 답변에 감사드립니다!
— Patrick Manser

5
여기서 주목해야 할 것은이 테이블에 PK가 없거나 ID와 언어가 복합 PK 여야한다는 것입니다. 그 중 하나이거나 ProductTranslationId 필드를 ID로 추가해야합니다.
— Daniel Lorenz

1
@ 루카 : 귀하의 질문에 대답하여 데이터를로드하는 데 사용하는 구현을 보여줍니다.
— M4N

1
@ AarónGutiérrez 글쎄, 재미있게도 id: D 라는 단일 열로 테이블을 만듭니다 . 설명하기 위해, 각 id두 개의 테이블을 얻을 수 있도록, 관계형 테이블에서 모든 언어에서 단어를 첨부 할 수있는 의미를 나타냅니다 meaning(ID)와 word(ID, meaning_id을)는 id의 word표는 단어의 ID를 나타냅니다 id에서이 meaning대표 보편적 인 의미.
— Timo Huovinen

18

Martin이 게시 한 답변을 추천합니다.

그러나 쿼리가 너무 복잡 해지는 것에 대해 걱정하는 것 같습니다.

모든 테이블에 대해 지역화 된 테이블을 만들려면 디자인과 쿼리를 복잡하게 만듭니다.

따라서 다음과 같은 간단한 쿼리를 작성하는 대신 생각할 수도 있습니다.

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

... 다음과 같은 쿼리 작성을 시작해야합니다.

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

아주 예쁜 관점은 아닙니다.

그러나 수동으로 수행하는 대신 특수 지역화 마크 업이 포함 된 SQL을 미리 구문 분석하여 데이터베이스로 보내야하는 실제 SQL로 변환하는 자체 데이터베이스 액세스 클래스를 개발해야합니다.

해당 시스템을 사용하면 다음과 같이 보일 수 있습니다.

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

그리고 더 잘할 수 있다고 확신합니다.

중요한 것은 테이블과 필드의 이름을 균일하게 지정하는 것입니다.


다른 질문은 제품에 대해 하나의 비즈니스 객체를 만드는 것입니다. 또는 2에 해당 항목과 작업에 쉽게 첫 번째 경우에 두 ... 만드는 차 쉬운 CMS 쓰기
— 아르센 Mkrtchyan

14

이 유형의 접근 방식이 저에게 효과적이라는 것을 알았습니다.

제품 제품 세부 국가
========= =================== =========
ProductId ProductDetailId CountryId
-기타-ProductId CountryName
            CountryId 언어
            제품 이름-기타-
            제품 설명
            -등-

ProductDetail 테이블에는 지원하려는 언어로 된 모든 번역 (제품 이름, 설명 등)이 있습니다. 앱의 요구 사항에 따라 국가 언어를 사용하도록 국가 테이블을 분류 할 수도 있습니다.


다른 로케일에는 사용자에게 표시 할 단위 시스템 및 측정 값에 대한 매우 구체적인 정보가 포함되어 있기 때문에 현재 작업중인 프로젝트에 이와 동일한 접근 방식을 선택했습니다.
— califrench

8
국가와 언어 (로케일)는 다릅니다. ISO 언어 코드는 자연스러운 키이므로 언어에서 국가로의 불필요한 참여를 제거합니다.
— gavenkoa

10

다음 접근 방식을 사용하고 있습니다.

생성물

제품 ID 주문 ID ...

제품 정보

제품 ID 제목 이름 LanguageID

언어

LanguageID 이름 문화, ....


2

Martin의 솔루션은 내 솔루션과 매우 유사하지만 원하는 번역을 찾을 수 없을 때 기본 설명을 어떻게 처리합니까?

각 필드에 대해 IFNULL () 및 다른 SELECT 문이 필요합니까?

기본 번역은 동일한 테이블에 저장됩니다. 여기서 "isDefault"와 같은 플래그는 현재 언어에 대한 설명이없는 경우 설명이 기본 설명인지를 나타냅니다.


1
@GorrillaApe : 원하는 언어를 찾을 수없는 경우 기본 언어로 돌아가는 방법에 대한 예제는이 답변을 참조하십시오. stackoverflow.com/a/27474681/19635
— M4N
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.