【问题标题】:Create tables for a dictionary?为字典创建表?
【发布时间】:2010-03-19 12:22:52
【问题描述】:

我正在使用 SQLite 制作字典数据库,需要一些提示。我的 SQL 有点生疏了 ;) 你会考虑这个好的 SQL 吗?它是通过 Java JDBC 完成的。

这是用于创建表格。

CREATE TABLE word (
id INTEGER,
entry STRING, 
pos STRING
);

CREATE TABLE translation (
word_id INTEGER REFERENCES word(id), 
entry STRING
);

当填充数据时,我给每个单词一个数字(id),并且单词翻译得到与 word_id 相同的数字。提取特定单词的翻译的最佳方法是什么?

【问题讨论】:

    标签: java sql sqlite


    【解决方案1】:

    word_id INTEGER REFERENCES word(id) 实际上并没有在 MySQL 上创建外键。即使您使用的是 InnoDB,它也需要明确的 FOREIGN KEY 声明。

    另外,我可能会为两个表的 ID 使用自动编号,然后将其标记为主键。

    因此,考虑到这两个因素,再加上 mpacona 关于多个翻译需要多对多关系的说明:

    CREATE TABLE word (
    word_id UNSIGNED INTEGER AUTOINCREMENT PRIMARY KEY,
    entry TEXT, 
    pos VARCHAR(50)
    );
    
    CREATE TABLE translation (
    translation_id UNSIGNED INTEGER AUTOINCREMENT PRIMARY KEY,
    word_id UNSIGNED INTEGER,
    lang VARCHAR(5),
    entry TEXT
    );
    
    CREATE TABLE word_translation (
    word_id UNSIGNED INTEGER, 
    translation_id UNSIGNED INTEGER,
    PRIMARY KEY (word_id, translation_id),
    INDEX (word_id),
    INDEX (translation_id),
    FOREIGN KEY fk_word_id (word_id) REFERENCES word(id),
    FOREIGN KEY fk_translation_id (translation_id) REFERENCES translation(id)
    );
    

    编辑:我不确定 pos 是什么,所以我将其限制为 50 个字符。如果您需要超过 32k 个字符,您可能还需要将 TEXT 调整为更大的变体之一。

    将 lang 更新为 5 个字符以支持 en-us 样式语法。

    【讨论】:

    • Pos 是词性。感谢您的提示!我必须阅读键和索引。
    【解决方案2】:

    我有第三张表来说明单词和翻译之间的关系

    CREATE TABLE word_translation (
    word_id INTEGER, 
    translation_id INTEGER
    );
    

    比起翻译表,只要有translation_id和entry。

    这样您就可以通过将 id 设置为表的主键来索引您的翻译和单词。

    这对您的查询也有帮助,因为您可以拥有许多带有许多翻译的单词,并且只有一个入口点

    【讨论】:

      【解决方案3】:

      如果你有一个“词概念”标识符和一个语言字段,那么你可以让它适用于多种语言:

      CREATE TABLE word (
        id INTEGER,
        entry STRING,
        language String,
        word_concept_id INTEGER,
        pos STRING
      );
      

      那么你的翻译查询是

      SELECT wr.entry FROM word wl, word wr 
      WHERE wl.entry='DOOR' AND 
        wl.language='EN' AND
        wl.word_concept_id=wr.concept_id AND
        wr.language='CZ'
      

      您只需要从 word_concept_id 字段中找出一个方案(这可能只是在您添加首选语言的术语时使用递增值作为种子)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-05
        • 2019-02-13
        • 2018-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多