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

Getting all the info from many normalized tables that are related to a single table

我有一个名为 Word 的 table,它有 8 个相关和规范化的 tables,它们有一个指向 Word id 的外键。

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

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

你是对的,你不想在这种情况下使用外部联接,因为可能会出现组合爆炸。然而,进行多次查询将导致八次往返,这也不理想。

为避免多次往返,您可以使用 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

注意每个 table 如何为结果提供一系列列,并用 NULL 填充剩余的列:word table 提供 word 列,antonym 提供 antonym_idantonymsynonym 提供 synonym_idsynonym,依此类推。

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