2011-06-11 62 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中,如果有人翻譯這篇西班牙文文章,我們會將翻譯後的文章放入其引用的Post中。

在不同的模型上存儲不同的語言內容是因爲搜索的人想這樣。他說這對搜索很有好處。

使其更清晰,例如,一些用戶書寫文章中,我們將做到以下幾點:

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, 
    pubdate datetime 
) 

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

的另一種方法,我見過幾次面,是這樣的:

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

它的好處是,它允許處理特定於語言環境的屬性(例如,英語標記/元對西班牙語標記/ meta)。但它很快變成了樹木處理的噩夢。所以不推薦。

,當然,還有你使用的一個,與直接在表中的默認語言:

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 
) 

我更喜歡的是它的頻繁的網站的原因具有未翻譯的頁面等,或者存在於一個站點但不存在於另一個站點上的頁面。無論如何,往往不是你的內容不應該從一個國家到另一個國家是相同的 - 你不會以同樣的方式與你的觀衆溝通。

2

他提出的模型似乎更合理;處理語言對我來說,處理它們的方式與對它們的處理方式不同,它更適合於標準化。

但是,不是爲每種語言創建一個表,而是爲內容創建一個表並添加一列來指示語言。

+0

在不同的模型上存儲不同的語言內容是因爲搜索的人想這樣。他說這對搜索很有好處。 – thoslin 2011-06-11 03:41:30

+0

如果他說有帽子有英文桌和西班牙語桌有助於表演,他是錯的。使用單個表格爲列中的內容指示語言。 – 2011-06-11 03:44:08