获取与单个表相关的许多规范化表中的所有信息

时间:2015-02-04 03:08:29

标签: sql sqlite

我有一个名为Word的表,它有8个相关的和规范化的表,这些表具有Word的id的外键。

    • ID
  • 杂项
    • ID
    • FK
  • 反义词
    • ID
    • FK
  • 示例
    • ID
    • FK
  • partofspeech
    • ID
    • FK
  • languageoforigin
    • ID
    • FK
  • 定义
    • ID
    • FK
  • 发音
    • ID
    • FK
  • 同义词
    • ID
    • FK

获取所有信息的最佳方式是什么?起初我想把LEFT OUTER JOIN加在一起,但是潜在的行数就是每个表的行数乘以一个指数高的数字。是应该使用Word.id单独查询每个表还是有一个sql语句可以很好地适应这种情况?

编辑:添加字段,所有外键都指向Word.id

1 个答案:

答案 0 :(得分:1)

你是对的,你不想在这种情况下使用外连接,因为它可能会发生组合爆炸。但是,进行多次查询会导致八次往返,这也不理想。

为避免多次往返,您可以使用UNION ALL进行非规范化查询,如下所示:

SELECT
    value as word
,   NULL AS antonym_id, NULL AS antonym
,   NULL AS synonym_id, NULL as synonym
,   ... -- add more columns here
FROM word WHERE id=@id
        UNION ALL
SELECT
    NULL as word
,   id AS antonym_id, value AS antonym
,   NULL AS synonym_id, NULL as synonym
,   ... -- add more columns here
FROM antonym WHERE fk=@id
        UNION ALL
SELECT
    NULL as word
,   NULL AS antonym_id, NULL AS antonym
,   id AS synonym_id, value as synonym
,   ... -- add more columns here
FROM synonym WHERE fk=@id

请注意每个表如何为结果提供一系列列,并使用NULL s填充其余列:word表提供word列,antonym耗材antonym_idantonymsynonym提供synonym_idsynonym,依此类推。

您可以通过对RDBMS进行一次往返,并将每行提供的列检查到相应列中的非空值,将此结果集读入具有多个附加列表的对象中。例如,当您看到非空synonym_id列时,您知道该行代表synonym表。