2011-06-11 5 views
-1

이제 Django를 사용하여 다국어 웹 사이트를 개발하고 있습니다. 우리는 우리 웹 사이트의 콘텐츠에 대해 다른 언어 버전을 가지고 있습니다. 예를 들어 게시물의 경우 영어와 스페인어 버전이 있습니다. 어떤 모델 디자인이 더 좋습니까?

class Post(models.Model): 
    user 
    title 
    detail 
    count_follower 
    ... 
    orginal_language 
    date 


class PostEspanish(models.Model): 
    post = models.ForeignKey(Post) 
    title 
    detail 

그래서 우리는 스페인어 콘텐츠에 대한 모든 영어 컨텐츠와 PostEspanish에 대한 포스트를 사용 현재 우리는이 모델을 사용하고 있습니다. 누군가가 영어로 글을 쓰면 Post 모델에 넣고 PostEspanish 모델로 번역 된 글을 씁니다. 누군가가 스페인어로 게시물을 작성하면 먼저 Post 인스턴스를 만든 다음 PostEspanish 인스턴스를 만들고 PostEspanish에 내용을 넣습니다. 누군가이 스페인어 게시물을 번역하면 참조 게시물에 번역 된 게시물을 넣습니다.

다른 모델에 다른 언어 콘텐츠를 저장하는 것은 검색 사람이이 방법을 원하기 때문입니다. 그는 그것이 수색에 좋다고 말한다.

if language == 'English': 
    post = Post.objects.create(..., orginal_language='english') 
else: 
    post = Post.objects.create(..., original_language='espanish') 
    PostEspanish.objects.create(post=post, ...) 

및 번역 :

이 명확하게하기 위해, 예를 들어, 어떤 사용자가 게시물을 기록, 우리는 다음을 수행합니다

post = Post.objects.get(id=id) 
if post.orginal_language == 'english': 
    post = post.postespanish 
    #update post 
    post.save() 
else: 
    #update post 
    post.save() 

오늘 누군가가 말했다이 모델의 디자인은 정말 가난 . 그는 현재의 모델이 객체 지향적이지 못하다고 말했다.

class Post(models.Model): 
    user 
    count_follower 
    ... 
    orginal_language 
    date 

class PostContentEnglish(models.Model): 
    post = models.ForeignKey(Post) 
    title 
    detail 

class PostContentEspanish(models.Model): 
    post = models.ForeignKey(Post) 
    title 
    detail 

그래서 코드는 다음과 같이 될 것이다 : 여기에 그들이 그것을 할 방법이

if language == 'English': 
    post = Post.objects.create(..., orginal_language='english') 
    PostContentEnglish.objects.create(post=post,...) 
else: 
    post = Post.objects.create(..., orginal_language='espanish') 
    PostContentEspanish.objects.create(post=post,...) 

그러나 우리 대부분은이 두 가지 접근 방식 차이가 없다 생각했다. 그리고 그의 모델 디자인은 정말 나쁜 테이블을 하나 더 생성 할 것입니다.

그럼 어느 것이 더 낫다고 생각합니까?

답변

0

은 언어이 (의사 코드)처럼 저장됩니다

posts (
    id  serial pkey, 
    parent int fkey posts (id), 
    lang  char(2), 
    pubdate datetime 
    title varchar, 
    content text 
) 

그것의 이점이 있다는 것입니다 :

posts (
    id  serial pkey, 
    pubdate datetime 
) 

posts_lang (
    id  int fkey posts (id), 
    lang  char(2), 
    title varchar, 
    content text, 
    pkey (id, lang) 
) 

내가 몇 번 본 적이 다른 방법이있다 로캘 별 특성 (예 : 영어 태그/메타 대 스페인어 태그/메타)을 처리 할 수 ​​있습니다. 그러나 그것은 신속하게 나무 취급의 악몽으로 변합니다. 따라서 추천하지 않습니다.

posts (
    id  serial pkey, 
    pubdate datetime 
    title varchar, 
    content text, 
) 

posts_lang (
    id  int fkey posts (id), 
    lang  char(2), 
    title varchar, 
    content text, 
    pkey (id, lang) 
) 

내가 바로 테이블에 기본 언어를 원하는에 대한 합리적인를 볼 수 있습니다

그리고 물론, 직접 테이블에서 기본 언어를 사용하고있는 하나있다. 하지만 제 경험상 코드 중복을 도입합니다. 즉, 두 가지 방식으로 끊임없이 일을하고 있습니다. 따라서 버그/단점이 있습니다. 그래서 정말 추천 할 수도 없습니다.

en.posts (
    id  serial pkey, 
    pubdate datetime 
    title varchar, 
    content text 
) 

es.posts (
    id  serial pkey, 
    pubdate datetime 
    title varchar, 
    content text 
) 

나는 그것이 사이트에 대해 자주라는 것이다 선호하는 이유 : 각 언어와 다른 스키마를 사용하여 (또는 DB, 또는 테이블 접두어) -

내 선호하는 대안은 위에 없습니다 번역되지 않은 페이지와 같은 페이지 또는 한 사이트에는 있지만 다른 페이지에는없는 페이지를 갖습니다. 그리고 종종 콘텐츠 이 국가마다 동일하지 않아야하며 동일한 방식으로 잠재 고객에게 전달하지 않아야합니다.

2

그가 제안하는 모델이 더 현명 해 보입니다. 언어를 치료하는 것은 다르게 치료하는 것보다 나에게 더 의미가 있으며, 더 적절하게 표준화됩니다.

그러나 각 언어에 대한 테이블을 만드는 대신 내용에 대해 하나의 테이블을 만들고 언어를 나타내는 열을 추가하십시오.

일반적으로
+0

다른 모델에 다른 언어 콘텐츠를 저장하는 것은 검색 사람이이 방법을 원하기 때문입니다. 그는 그것이 수색에 좋다고 말한다. – thoslin

+0

영어로 된 테이블과 스페인어로 된 테이블을 가지고 모자를 쓰는 것이 성과에 도움이된다면 그는 틀 렸습니다. 열이있는 내용의 경우 단일 테이블을 사용하여 언어를 나타냅니다. –

관련 문제