DB在同一个表上的多对多关系

时间:2015-04-07 21:08:25

标签: mysql sql database

我正在为语言词典创建一个数据库。我有一个用不同语言的单词定义表。

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)
...

我已经阅读了很多关于很多人的关系,但就我而言,我认为第一种选择(所有语言都有一条记录)更好,但我不太确定。有人会说他们认为最好。感谢。

4 个答案:

答案 0 :(得分:3)

我会在主表中添加另一列

DEFINITIONS
-----------
Id
Definition
Language
WordId

并为每个组分配一个word_id,以表明它们都是相同的单词。

1->casa->Spanish->10
2->house->English->10
3->maison->French->10

答案 1 :(得分:0)

第二个肯定更好。

  • 如果您添加语言,则无需更改结构
  • 所有语言对的查询都是相同的。语言ID是查询参数。这意味着更好的查询优化和更少的代码
  • 更简单的更新/删除/插入操作
  • 对同义词的更好支持
只要你的话有一个含义和一个翻译,布莱恩的想法也很好。如果它们有多个,则需要扩展。

答案 2 :(得分:0)

桥接表仅对动态内容有意义,您的内容是静态的,可以轻松地按行定义。桥表需要连接来减慢查询速度,所以我猜一个表是最有意义的,如果你关心的是查询速度。

但是,如果没有为所有语言定义某些单词,该怎么办?比你在数据库上浪费了大量空间,这意味着使用桥接表是有意义的。

我建议使用一个非常长的表,如english_word,english_Definition,french_word,french_definition等......

答案 3 :(得分:0)

我已经对Brian的答案提出了异议,但我有足够的补充说,我认为值得一个额外的答案:

真的,远离第一个想法。添加新语言会产生大量开销,这意味着您需要对许多不同的查询进行硬编码,或使用动态生成的SQL来使用该表。

存储成对关系的第二个想法更好。首先,对它编写查询似乎更难,但是一旦你习惯了它,它们将更加通用,更直接。但是,这种设计要求您选择两种方法中的一种,其中任何一种都有缺陷:

  • 存储所有可能的对(英语/法语,英语/西班牙语,法语/西班牙语)。这样可以相对简单地查找任意翻译,但需要更多存储空间,并且如果一次查看两种以上语言,则可能存在不一致的情况。您还需要决定是否在两个方向上存储每对;如果不是,查询会变得更复杂。

  • 存储足够的对以建立等效(例如,存储英语/法语和法语/西班牙语),然后在必要时遍历它们以找到任何给定的翻译。最简单的方法是选择一种语言,它始终是每对中的第一种语言(例如存储西班牙语/英语和西班牙语/法语对)。但即便如此,您还需要知道哪种语言是中心语言的应用程序逻辑。

如果您使用Brian建议的设计,可以使用相同的通用查询完成从一种语言到另一种语言的任意翻译,只需插入所需的语言和单词即可。