具有2个具有不同数据类型的字段的表,其中只有一个用于联接目的,这是一个好的解决方案吗?

时间:2019-06-28 14:24:48

标签: database-design relational-database

我正在设计一个带有关系数据库的简单字典数据库。有一个表存储所有英语单词,命名为WordEn,并以整数id 作为主键。然后还有另一个表,命名为ExplanationEn,该表以与英语不同的语言(例如,英语)存储所有英语单词的说明。中文,日文等。在我的第一个计划中,ExplanationEn表包含以下列:

  • wordId-引用WordEn主键的外键
  • language-解释用哪种语言
  • explanation-给定语言的解释(带有字符串-varchar数据类型)

WordEnExplanationEn之间的关系是一对多,因为一个词肯定有很多含义

但是考虑到很多英语单词可能有另一种语言的对应单词,我打算创建另一个表,例如WordCh存储中文单词因此,我仍然想利用ExplanationEn来桥接WordEnWordCh。我想到了两种解决方案:

  1. 保持ExplanationEn表的结构不变,然后在ExplanationEn join WordCh时,条件可以 cast 整数的解释并与WordCh.id比较转换的费用​​将在ExplanationEn表的每个记录上

  2. 添加一个新字段,例如称为counterPartId,作为WordChExplanationEn的外键。结果,ExplanationEn的每个记录将包含WordChExplanationEn字段为空,这意味着两个字段都无法填充值。与第一种解决方案相比,它现在具有将 cast 字符串值转换为整数的代价,但是添加了一个额外的字段

问题:这两个之中哪个是更好的解决方案,或者还有其他更好的解决方案?

2 个答案:

答案 0 :(得分:0)

假设每个英语单词只有另一种语言的解释,并且可以最多具有该语言的另一个对应单词,我认为一个好的解决方案可以是在ExplanationEx表包含给出解释所用语言的相应单词。这个新字段(例如translation)可以具有空值。

使用此解决方案,您可以减少用于检索所需信息的联接数。

答案 1 :(得分:-1)

我可以使用3张桌子:
单词(单词,wordId,语言)
意思(wordId,含义,含义ID)
Translatesv1 (fromMeaningId,toMeaningId)-自连接表

Translatesv2 (groupId,含义ID)-自我联接表

基数:
1种语言的1个单词可能具有多种含义
含义需要一个自联接表。

想法是在含义之间(而不是单词之间)建立自我连接,并进行概括,因此您不必在每次添加新语言时都更改db结构。
Translatev1的缺点是它具有隐式的“从..到”方向。
Tranlastev2的实现有点复杂,但更灵活,可以在任何方向上工作。