2

몇 가지 매우 큰 (100k +) 개체를 사용할 수 있으며 20 개 이상의 언어로이 데이터 (예 : 이름)를 제공 할 수 있다고 가정 해 보겠습니다. 이 데이터를 SQL 데이터베이스에 저장/처리하는 효율적인 방법은 무엇입니까?콘텐츠 번역을 효율적으로 저장하는 방법은 무엇입니까?

이렇게하는 분명한 방법은 다음과 같습니다. 그러나 더 합리적인 다른 방법이 있습니까? 나는 약간의 성능에 대해 걱정한다.

CREATE TABLE "object" (
     "id" serial NOT NULL PRIMARY KEY 
);         
    CREATE TABLE "object_name" (
     "object_id" integer NOT NULL REFERENCES "object" ("id") 
     "lang" varchar(5) NOT NULL, 
     "name" varchar(50) NOT NULL 
); 

은 사용에 관해서는, 사용은 하나 개의 언어를 선택하고 그 가능성이 큰이 object_name 테이블을 통해 조인 발생합니다.

조숙 한 최적화인지 아닌지, 나는 다른 접근법에 관심이있다. 마음의 평화 만 얻을 수 있다면, 명백한 해결책은 매우 어리 석다는 것이 아니다.

실제 모델을 명확히하는 것은 훨씬 더 복잡합니다. 지금까지 확인 된 패턴은 입니다.

답변

3

(object_id, lang)에 결합 된 키가있는 경우 조인이 없어야하며 O (1) 조회 일뿐입니다. (EXPLAIN SELECT으로 시도하십시오)

+0

아, 맞습니다. 좋은 지적. – phoku

2

내 자신의 프로젝트에서 나는 DB 수준으로 번역하지 않습니다. 사용자 (또는 운영체제)가 나에게 랭 코드 (lang code)를 부여한 다음 해시로 모든 텍스트를로드합니다. 그런 다음 DB에서 해당 해시에 대한 ID를 보내고 내가 어딘가에 표시하면 텍스트를 번역합니다.

내 ID는 문자열이기도합니다. 그렇게하면 어떤 텍스트를 사용하고 있는지 확인할 수 있습니다 ("USER"와 "136"비교 - DB를 보지 않고 UI에서 "136"이 의미하는 것을 알고 있습니까?).

[편집] UI 수준에서 번역 할 수 없다면 DB 디자인이 최선을 다하는 것입니다. 가능한 한 작고 색인하기 쉽고 조인이 많이 필요하지 않습니다.

한 걸음 더 나아가서 앱 수준에서 SQL 쿼리를 생성 할 수있는 경우보기 (언어 당 하나)를 만든 다음 조인의보기를 사용하여 2 열 조인을 피하십시오. 그러나 이러한 복잡한 접근 방식이 ROI가 긍정적인지는 의심 스럽습니다.

+1

제한된 수의 문자열이있는 UI에서는 문제가 없지만 100k + 오브젝트/문자열로 원하는 것이 있다면 메모리에 저장하지 않을 것입니다. – Wim

+0

그는 번역에 msg_id를 매핑 할 때 tranlation 테이블을 사용한다고 생각합니다. . 특별히 gettext를 사용할 수있는 것은 아닙니다. – phoku

+0

@Wim : 나는 DB 수준에서 그렇게하지 않을 것이라고 생각합니다. 객체가 너무 많으면 UI 수준에서 캐시를 사용합니다. –

0

각 언어마다 하나씩 여러 개의 테이블을 사용하는 것이 고려해 봤습니까?

코딩 복잡성 측면에서는 약간의 비용이 들지만, 언어 당 하나의 테이블 만로드/액세스 할 수 있습니다. 메타 데이터는 더 작아지고 따라서 시간이 더 효율적입니다. 'T는 당신이 정말로 하나의 테이블에-규칙 그들 모두, 당신이보기를 만들 수 있습니다 원하는 경우, 또한 각 행에 대해 "LANG"변수)

을 가지고 있고 또한

+0

왜 동일한 테이블에 필드를 추가하지 않으시겠습니까? 내가 어쨌든 언어를 '하드 코드'할 예정이라면? – phoku

0

을 :) 가입 Wim이 writed 한 것에, 당신의 경우의 OBJECT 테이블은 쓸모가 없습니다. OBJECT_NAME 테이블에 포함되지 않은 정보는 저장하지 않으므로 테이블이 필요 없습니다.

관련 문제