使用“链式”条目规范化数据库

时间:2010-08-22 20:43:34

标签: database-design normalization

我是数据库设计的新手,我还没有找到一种确定的方法来构建我的词汇表数据库。除了不相关的领域之外,我想要存储的数据在概念上是这样的:

Word 1

  • 含义1(其中1-n)
    • 实施例1(这些中的0-n)
    • 示例2
    • ...
  • 含义2
  • ...

Word 2

...

现在,Word由三个属性标识:Wordname,Language和POS(词性)。我把它设置为复合键。根据我的阅读,我认为意义和例子应该在不同的表中,也许是这样的:

Word表格

  • 关键
    • Wordname
    • 语言
    • POS
  • ...

含义表

  • 关键
    • Wordname
    • 语言
    • POS
  • 含义(每个键1行)

示例表

  • 关键
    • Wordname
    • 语言
    • POS
    • 含义
  • 示例(每个键0-n行)

但这让我感到震惊,因为数据重复可怕。将wordname-language-POS密钥抽象到一个单独的表中并为每一行提供一个唯一密钥会更好吗?是否有一些方法更好?

非常感谢。

3 个答案:

答案 0 :(得分:1)

通常,您可以通过为每个表的每一行生成唯一键来节省一些麻烦,其中键是一个简单的整数,而不是实际数据。外键引用更容易,并且您不必处理诸如“oops,某个拼写错误的单词之类的问题,但该单词现在是另一个表中的外键的一部分!”当密钥值发生变化时,强制执行外键完整性的数据库确实会使生活变得困难。

而且,正如您所说,使用单词和其他信息作为外键是很多重复。正常化的整个要点(好吧,其中一个,无论如何)是消除重复。

大多数数据库引擎都会为您生成这些密钥,通常使用名为“identity”的属性。插入新数据时,这些数据库通常可以通过编程方式轻松检索这些键。然而,这会更多地涉及代码和实现。

答案 1 :(得分:1)

你走在正确的轨道上,但请注意有一个列限制。

  1. MEANING表中,key将是WORD.key值的外键 - 这使您可以与WORD表中的值相关联而无需它们在MEANING表中重复。
  2. 如果您这样做MEANING.key并非唯一,则可以支持无限MEANING.meaning
  3. 实施例

    WORD

    • 键(主键)
    • wordname
    • 语言
    • POS

    示例:

    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'