复杂字典的数据库设计

时间:2017-05-22 20:31:46

标签: mysql sql database dictionary database-design

引言

我需要为多语言字典设计数据库。

我看了similar problem in SO,但事实证明这是一个更简单的案例,并不适用。

要求

  1. 每种语言的同义词
  2. 具有不同结尾但在每种语言中具有相同根词的单词
  3. 多种语言
  4. 实施例

    我的想法是这样的:

    table: languages (id, name)
    1, English
    2, French
    
    table: words (id, lang_id, word)
    1, 1, cat
    2, 1, pussy cat
    3, 1, kitten
    4, 1, puss
    5, 2, le chat
    6, 2, le felin
    
    table: synonyms (id, word_id, word_id)
    1, 1, 2
    2, 1, 3
    3, 1, 4
    4, 5, 6
    
    table: translations (id, word_id, word_id)
    1, 1, 5
    2, 2, 5
    3, 3, 5
    4, 4, 5
    5, 1, 6
    6, 2, 6
    7, 3, 6
    8, 4, 6
    

    然而,我在这里看到了一些问题:

    • 为了访问单词的同义词:kitten。首先需要找到" master"单词(cat),然后是该单词的所有同义词。
    • 在我看来,替代方案甚至更糟,即 - 存储每个单词的所有同义词关系,这是多余的,并且可以“失控”#34;快速...

    问题1

    我错过了什么吗?在这种情况下,有更好的组织数据库的方法吗?请分享您对此问题的看法。

    问题2

    目前,我不知道如何处理要求的第2点。

    最后

    感谢您的时间和知识。

1 个答案:

答案 0 :(得分:3)

让我们采用不同的方法。您的示例显示“cat”的6个单词(包括“cat”)。我们称之为concept数字1。

CREATE TABLE Concepts (
    concept MEDIUMINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    description TEXT  -- such as "feline animal"
);

然后是:

CREATE TABLE Words (
    word_id MEDIUMINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    concept MEDIUMINT UNSIGNED NOT NULL,
    lang TINYINT UNSIGNED NOT NULL,
    word VARCHAR(111),
    INDEX(concept, lang, word),
    INDEX(lang, word)
);

这涵盖了同义词和翻译。