我正在为语言词典创建一个数据库。我有一个用不同语言的单词定义表。
DEFINITIONS
-----------
Id
Definition
Language
例如,某些记录可能是:
1->casa->spanish
2->house->english
3->maison->french
...
现在我必须为关系创建另一个表格,但我不知道如何正确地做到这一点。在我的应用程序中,我可以或多或少地使用10种语言。我认为有两种方法:
RELATIONSHIPS
-------------
Id
Id_Spanish
Id_English
Id_French
...
因此,在同一记录中,我有不同语言的单词。或者用另一种方式:
RELATIONSHIPS
-------------
Id
Id_Language_1
Id_Language_2
并成对链接单词,例如:
1(Id) -> 1(Id_Language_1) -> 2(Id_Language_2)
1(Id) -> 1(Id_Language_1) -> 3(Id_Language_2)
...
我已经阅读了很多关于很多人的关系,但就我而言,我认为第一种选择(所有语言都有一条记录)更好,但我不太确定。有人会说他们认为最好。感谢。
答案 0 :(得分:3)
我会在主表中添加另一列
DEFINITIONS
-----------
Id
Definition
Language
WordId
并为每个组分配一个word_id,以表明它们都是相同的单词。
1->casa->Spanish->10
2->house->English->10
3->maison->French->10
答案 1 :(得分:0)
第二个肯定更好。
答案 2 :(得分:0)
桥接表仅对动态内容有意义,您的内容是静态的,可以轻松地按行定义。桥表需要连接来减慢查询速度,所以我猜一个表是最有意义的,如果你关心的是查询速度。
但是,如果没有为所有语言定义某些单词,该怎么办?比你在数据库上浪费了大量空间,这意味着使用桥接表是有意义的。
我建议使用一个非常长的表,如english_word,english_Definition,french_word,french_definition等......
答案 3 :(得分:0)
我已经对Brian的答案提出了异议,但我有足够的补充说,我认为值得一个额外的答案:
真的,远离第一个想法。添加新语言会产生大量开销,这意味着您需要对许多不同的查询进行硬编码,或使用动态生成的SQL来使用该表。
存储成对关系的第二个想法更好。首先,对它编写查询似乎更难,但是一旦你习惯了它,它们将更加通用,更直接。但是,这种设计要求您选择两种方法中的一种,其中任何一种都有缺陷:
存储所有可能的对(英语/法语,英语/西班牙语,法语/西班牙语)。这样可以相对简单地查找任意翻译,但需要更多存储空间,并且如果一次查看两种以上语言,则可能存在不一致的情况。您还需要决定是否在两个方向上存储每对;如果不是,查询会变得更复杂。
存储足够的对以建立等效(例如,存储英语/法语和法语/西班牙语),然后在必要时遍历它们以找到任何给定的翻译。最简单的方法是选择一种语言,它始终是每对中的第一种语言(例如存储西班牙语/英语和西班牙语/法语对)。但即便如此,您还需要知道哪种语言是中心语言的应用程序逻辑。
如果您使用Brian建议的设计,可以使用相同的通用查询完成从一种语言到另一种语言的任意翻译,只需插入所需的语言和单词即可。