我試圖建立一個數據庫模式來存儲轉換,不同語言之間的有效數據庫模式。到目前爲止,它看起來像這樣(簡單):
class Language(models.Model):
tag = models.CharField(max_length=2)
def __unicode__(self):
return self.tag
class Phrase(models.Model):
name = models.TextField()
language = models.ForeignKey(Language)
def __unicode__(self):
return self.name
class Meta:
unique_together = ("name", "language")
index_together = [
["name", "language"]
]
class Translation(models.Model):
phrase1 = models.ForeignKey(Phrase, related_name="translation_as_1")
phrase2 = models.ForeignKey(Phrase, related_name="translation_as_2")
def __unicode__(self):
return self.phrase1.name + " <=> " + self.phrase2.name
class Meta:
unique_together = ("phrase1", "phrase2")
index_together = [
["phrase1", "phrase2"]
]
這個數據庫模式似乎對我來說合乎邏輯。我用不同語言存儲短語,然後翻譯包含兩個短語。
問題
的問題是,查詢,導致了這個模式的,看起來有種討厭。例如:
from django.db.models import Q
name = "my phrase"
translations = Translation.objects.filter(Q(phrase1__name=text)|Q(phrase2__name=text))
translated_names = []
for translation in translations:
name1 = translation.phrase1.name
name2 = translation.phrase2.name
if name1 == name:
translated_names.append(name2)
else:
translated_names.append(name1)
我總是要包含「或」的關係,以確保,我得到的所有可能的翻譯,因爲這句話可以存儲爲phrase1或phrase2。最重要的是,我必須過濾我的結果才能得到正確的compiled_name(for循環)。
進一步闡釋
之前,我切換到所描述的模式,我有以下模式,而不是(Phrase
和Language
都和以前一樣):
class Translation(models.Model):
phrase = models.ForeignKey(Phrase)
name = models.TextField()
def __unicode__(self):
return self.phrase.name + " => " + self.name
class Meta:
unique_together = ("phrase", "name")
index_together = [
["phrase", "name"]
這種模式讓我查詢像這樣:
from django.db.models import Q
name = "my phrase"
translations = Translation.objects.filter(phrase__name=text)
translated_names = [t.name for t in translations]
這看起來好多了,當然是更快。但是這種模式有一個缺點,它只向一個方向提供翻譯,所以我轉移到了另一個,這並不是我想要的,因爲查詢太慢而且太複雜。
問題
那麼,有沒有一個好的模式對於這類問題,我也許忽略?
備註
我不是隻關心Django的相關答案。針對這種問題的純SQL模式對我來說也很有趣。
感謝您的回答。但是你的建議方式非常之多,我之前有過並在「進一步解釋」一節中描述過。它的缺點是,我無法通過兩種方式存儲翻譯。最後,我希望能夠以下列方式簡單高效地查詢翻譯:「給我所有的Y語言的X字翻譯爲Z語言的翻譯」 – basilikum