一个 table 有 2 个不同数据类型的字段,其中只有一个用于连接目的,这是一个好的解决方案吗?
A table with 2 fields with different data types, only one of them is for join purpose, is this a good solution?
我正在用关系数据库设计一个简单的字典数据库。有一个table存放所有的英文单词,命名WordEn
,用一个整数id作为主键 .然后还有一个table,命名为ExplanationEn
,存储所有英文单词在不同语言中的解释,例如中文,日文等。在我的第一个计划中, ExplanationEn
table 包含以下列:
wordId
-- 外键引用WordEn
的主键
language
-- 解释是什么语言
explanation
-- 给定语言的解释(使用字符串 - varchar
数据类型)
WordEn
和ExplanationEn
之间的关系是一对多因为一个词肯定可以有很多含义
但考虑到很多英语单词在另一种语言中可能有对应的单词,我打算再创建一个table,例如WordCh
存储中文单词 所以我还是想用ExplanationEn
来桥接WordEn
和WordCh
。我想到了两个解决方案:
保持ExplanationEn
table的结构不变,那么当ExplanationEn
join
WordCh
时,条件就可以了cast解释为integer并与WordCh.id
比较cast的成本将在每条记录上ExplanationEn
table
添加一个新字段,例如称为 counterPartId
,作为 WordCh
到 ExplanationEn
的外键。因此,ExplanationEn
的每条记录将包含 WordCh
或 ExplanationEn
字段为空,这意味着不可能两个字段都填充值。与第一个解决方案相比,它现在确实有 cast string value to integer 的成本,但是增加了一个额外的字段
问题:这两个方案哪个更好,或者还有其他更好的方案吗?
假设每个英语单词在另一种语言中只有一个解释,并且可以至多在该语言中有另一个对应的单词,我认为一个好的解决方案可以是添加ExplanationEx
table 的新字段,其中包含给出解释的语言中的相应单词。这个新字段(例如 translation
)可以有空值。
使用此解决方案,您可以减少用于检索所需信息的联接数。
我会和 3 table 一起工作:
Words(单词、wordId、语言)
Meanings (wordId, meaning, meaningId)
Translatesv1 (fromMeaningId, toMeaningId) -- 自连接 table
或
Translatesv2(groupId, meaningId) -- 自加入table
基数:
1 种语言中的 1 个单词可能有多种含义
含义需要自连接 table.
我们的想法是在含义之间而不是在单词之间进行自连接,并且进行概括,这样您就不必在每次包含新语言时都更改数据库结构。
Translatev1 的缺点是它有一个隐含的 'from..to' 方向。
Tranlastev2 实现起来有点复杂,但更灵活,可以在任何方向上工作。
我正在用关系数据库设计一个简单的字典数据库。有一个table存放所有的英文单词,命名WordEn
,用一个整数id作为主键 .然后还有一个table,命名为ExplanationEn
,存储所有英文单词在不同语言中的解释,例如中文,日文等。在我的第一个计划中, ExplanationEn
table 包含以下列:
wordId
-- 外键引用WordEn
的主键
language
-- 解释是什么语言explanation
-- 给定语言的解释(使用字符串 -varchar
数据类型)
WordEn
和ExplanationEn
之间的关系是一对多因为一个词肯定可以有很多含义
但考虑到很多英语单词在另一种语言中可能有对应的单词,我打算再创建一个table,例如WordCh
存储中文单词 所以我还是想用ExplanationEn
来桥接WordEn
和WordCh
。我想到了两个解决方案:
保持
ExplanationEn
table的结构不变,那么当ExplanationEn
join
WordCh
时,条件就可以了cast解释为integer并与WordCh.id
比较cast的成本将在每条记录上ExplanationEn
table添加一个新字段,例如称为
counterPartId
,作为WordCh
到ExplanationEn
的外键。因此,ExplanationEn
的每条记录将包含WordCh
或ExplanationEn
字段为空,这意味着不可能两个字段都填充值。与第一个解决方案相比,它现在确实有 cast string value to integer 的成本,但是增加了一个额外的字段
问题:这两个方案哪个更好,或者还有其他更好的方案吗?
假设每个英语单词在另一种语言中只有一个解释,并且可以至多在该语言中有另一个对应的单词,我认为一个好的解决方案可以是添加ExplanationEx
table 的新字段,其中包含给出解释的语言中的相应单词。这个新字段(例如 translation
)可以有空值。
使用此解决方案,您可以减少用于检索所需信息的联接数。
我会和 3 table 一起工作:
Words(单词、wordId、语言)
Meanings (wordId, meaning, meaningId)
Translatesv1 (fromMeaningId, toMeaningId) -- 自连接 table
或
Translatesv2(groupId, meaningId) -- 自加入table
基数:
1 种语言中的 1 个单词可能有多种含义
含义需要自连接 table.
我们的想法是在含义之间而不是在单词之间进行自连接,并且进行概括,这样您就不必在每次包含新语言时都更改数据库结构。
Translatev1 的缺点是它有一个隐含的 'from..to' 方向。
Tranlastev2 实现起来有点复杂,但更灵活,可以在任何方向上工作。