从许多与单个 table 相关的规范化 table 中获取所有信息
Getting all the info from many normalized tables that are related to a single table
我有一个名为 Word 的 table,它有 8 个相关和规范化的 tables,它们有一个指向 Word id 的外键。
- 单词
- id
- 价值
- 杂项
- id
- fk
- 值
- 反义词
- id
- fk
- 值
- 例子
- id
- fk
- 值
- 词性
- id
- fk
- 值
- 原始语言
- id
- fk
- 价值
- 定义
- id
- fk
- 价值
- 发音
- id
- fk
- 值
- 同义词
- id
- fk
- 值
获取所有信息的最佳方式是什么?起初我想 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_id
和 antonym
,synonym
提供 synonym_id
和 synonym
,依此类推。
您可以将此结果集读取到具有多个附加列表的对象中,方法是对 RDBMS 进行单次往返,并检查每行提供的列以查找相应列中的非空值。例如,当您看到非空 synonym_id
列时,您知道该行代表 synonym
table.
我有一个名为 Word 的 table,它有 8 个相关和规范化的 tables,它们有一个指向 Word id 的外键。
- 单词
- id
- 价值
- 杂项
- id
- fk
- 值
- 反义词
- id
- fk
- 值
- 例子
- id
- fk
- 值
- 词性
- id
- fk
- 值
- 原始语言
- id
- fk
- 价值
- 定义
- id
- fk
- 价值
- 发音
- id
- fk
- 值
- 同义词
- id
- fk
- 值
获取所有信息的最佳方式是什么?起初我想 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_id
和 antonym
,synonym
提供 synonym_id
和 synonym
,依此类推。
您可以将此结果集读取到具有多个附加列表的对象中,方法是对 RDBMS 进行单次往返,并检查每行提供的列以查找相应列中的非空值。例如,当您看到非空 synonym_id
列时,您知道该行代表 synonym
table.