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


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을)는 idword표는 단어의 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.