【发布时间】:2018-04-11 17:04:17
【问题描述】:
我有一个名为 db 的数据库,其中包含具有相同架构的表,例如:
table_1、table_2、...table_n
假设每个表都有“key”和“value”列,我想选择所有 n 个表中 key = 'x'
例如,对于 key = '1' 的下表:
table_1 = {'1' => 'aaa', '2' => 'xyz'}
table_2 = {'1' => 'bbb, '3' => 'zzz'}
table_3 = {'1' => 'ccc, '3' => 'xxx'}
我希望结果集是 {'1' => 'aaa', '1' => 'bbb', '1' => 'ccc'}
我查了一下,发现我可以通过从 INFORMATION_SCHEMA 中选择它们来获取所有表,如下所示:
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('value')
AND TABLE_SCHEMA='db';
但现在我需要找到一种方法来以这种方式(伪代码)遍历结果集:
foreach (table in tablesResultSet)
{ results += SELECT * FROM table WHERE key = 'x' }
我为粗略的伪代码道歉,但我发现这是描述问题的最佳方式。 感谢您的帮助。
【问题讨论】:
-
跨多个表的 EAV。很棒的反模式组合:/
-
听起来你的架构还有很多不足之处。动态确定要从哪些表中选择通常意味着糟糕的数据库设计。为什么不是所有这些记录都在一个表中。使用一个新列来描述它们属于哪个
_N(前表)。然后你只需要SELECT key, value FROM my_one_table WHERE key=1;。 -
最后,您将不得不构建一个丑陋的 UNION 查询:
SELECT key, value FROM table_1 WHERE key=1 UNION ALL SELECT key, value FROM table_2 WHERE key_1 UNION ALL SELECT key, value FROM table_N WHERE key_1.... -
@JNevill 在数据库的物理级别上,拥有多个表是有意义的(电话公司使用 24 个 100GB 表比使用一个 2.4TB 表要容易得多)。但是您需要一个数据库在幕后执行所有这些操作的设置。逻辑模式应该只是一张表。
-
@AndrewLazarus 是的。我同意。一个分区的表,甚至只是正确索引的表,将是正确的解决方案。我假设 OP 没有重新设计架构的能力,但如果这是一个处于起步阶段的应用程序,那么重新设计和处理小后果将是谨慎的。