我是数据库设计的新手,我还没有找到一种确定的方法来构建我的词汇表数据库。除了不相关的领域之外,我想要存储的数据在概念上是这样的:
Word 1
Word 2
...
现在,Word由三个属性标识:Wordname,Language和POS(词性)。我把它设置为复合键。根据我的阅读,我认为意义和例子应该在不同的表中,也许是这样的:
Word表格
含义表
示例表
但这让我感到震惊,因为数据重复可怕。将wordname-language-POS密钥抽象到一个单独的表中并为每一行提供一个唯一密钥会更好吗?是否有一些方法更好?
非常感谢。
答案 0 :(得分:1)
通常,您可以通过为每个表的每一行生成唯一键来节省一些麻烦,其中键是一个简单的整数,而不是实际数据。外键引用更容易,并且您不必处理诸如“oops,某个拼写错误的单词之类的问题,但该单词现在是另一个表中的外键的一部分!”当密钥值发生变化时,强制执行外键完整性的数据库确实会使生活变得困难。
而且,正如您所说,使用单词和其他信息作为外键是很多重复。正常化的整个要点(好吧,其中一个,无论如何)是消除重复。
大多数数据库引擎都会为您生成这些密钥,通常使用名为“identity”的属性。插入新数据时,这些数据库通常可以通过编程方式轻松检索这些键。然而,这会更多地涉及代码和实现。
答案 1 :(得分:1)
你走在正确的轨道上,但请注意有一个列限制。
MEANING
表中,key
将是WORD.key
值的外键 - 这使您可以与WORD
表中的值相关联而无需它们在MEANING
表中重复。MEANING.key
并非唯一,则可以支持无限MEANING.meaning
值实施例
示例:
key wordname language POS
----------------------------------
1 'foobar' 'English' idk
示例:
key meaning
----------------
1 'a'
1 'b'
如果你想要意义值的顺序,你必须定义一个列以某种方式指示顺序 - IE:meaning_id
答案 2 :(得分:1)
我也会提倡一个整数的密钥。然后你的表变得非常简单:
字符强>
KEYTABLE
WordName
语言
PartOfSpeach
<强>含义强>
KEYTABLE
关键字
描述
示例强>
KEYTABLE
KeyMeaning
描述
有了一个词,你就可以相对容易地得到给定单词的所有含义:
SELECT m.Description
FROM Word w, Meaning m
WHERE w.KeyTable = m.KeyWord
AND w.WordName = 'Example'
给定单词的示例也相当简单:
SELECT m.Description, e.Description
FROM Word w, Meaning m, Example e
WHERE w.KeyTable = m.KeyWord
AND m.KeyTable = e.KeyMeaning
AND w.WordName = 'Example'