我有一个名为Word的表,它有8个相关的和规范化的表,这些表具有Word的id的外键。
获取所有信息的最佳方式是什么?起初我想把LEFT OUTER JOIN加在一起,但是潜在的行数就是每个表的行数乘以一个指数高的数字。是应该使用Word.id单独查询每个表还是有一个sql语句可以很好地适应这种情况?
编辑:添加字段,所有外键都指向Word.id
答案 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_id
和antonym
,synonym
提供synonym_id
和synonym
,依此类推。
您可以通过对RDBMS进行一次往返,并将每行提供的列检查到相应列中的非空值,将此结果集读入具有多个附加列表的对象中。例如,当您看到非空synonym_id
列时,您知道该行代表synonym
表。