database - 2 个表的 2 个记录之间的计算需要扩展到超过 1300 个字段。如何以及哪个数据库可以实现这一目标?

标签 database postgresql database-design

对于我们的一个项目,我们使用 PostgreSQL 并由于性能优势访问两个具有复杂 SQL 计算的表。

每个表,我们称它们为TableATableB,有1301个 double 类型的字段(字段数量受PostgreSQL限制!) TableA的字段名称 是:id, A1, A2, ..., A1300 和 for 表 B:idB2,...,B1300

我们正在使用许多动态变化的公式,这些公式可以通过简单的 id 连接直接访问两个表,以对记录中的数字数据进行计算。

示例公式为:A99 * ((A1 * B3)/(B5 * B88))

所以程序可以简单地采用公式并直接在 SQL 中使用它,例如:

select A99 * ((A1 * B3) / (B5 * B88)) as ResultValue
from TableA A
join TableB B on A.id = B.id

这在对 2 个索引表的一个数据库请求中工作得很快。 但是随着时间的推移,系统已经长大,所有可用的字段都用完了。

现在,要求对使用的字段数量几乎没有限制,以在一个 SQL select 中容纳 2 个表的更长和更复杂的计算。 我必须承认,我对许多其他新数据库系统及其解决此类问题的能力知之甚少。是否有数据库支持这样的概念或其他方式在数据库中完成这些计算? 旧的方式暂时很灵活,但是有没有更高效的方式来实现同样的逻辑呢? 将数据动态读出到程序中,对其进行解析和计算可能需要更长的时间。 我还认为仅使用另一个允许定义包含超过 1300 个字段的表的数据库将是一个短期解决方案,直到我们需要更多字段。

最佳答案

以我上面的评论为例,对每个值使用数组而不是离散字段:

create table tablea (
  id int not null,
  a numeric[]
);    

create table tableb (
  id int not null,
  b numeric[]
);

insert into tablea
select 2, array (select generate_series(1,10000));

insert into tableb
select 2, array (select generate_series(1,10000));


select
  A[99] * ((A[1] * B[3]) / (B[5] * B[88])) 
from
  tablea
  join tableb on
    tablea.id = tableb.id
where
  tablea.id = 2;

关于database - 2 个表的 2 个记录之间的计算需要扩展到超过 1300 个字段。如何以及哪个数据库可以实现这一目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30905590/

相关文章:

mysql - 验证我的数据库关系?

java - 如何使用 Flyway 处理新的中间迁移

PostgreSQL - 查找两个值的相等性,这两个值都可以是 NULL

MySQL 统计引用外键的属性

perl - 如何使用 postgres dbd 占位符作为数据库对象名称

postgresql - 将函数参数转换为函数

database-design - 在数据库中存储Mandelbrot值的最佳方法是什么?

python - 无法通过Python创建SO问题的MySQL数据库

java - 如何针对两个条件执行 RealmQuery

database - 如何在 Eclipse DTP 中为每个数据库连接设置多个模式?