Database design 应该使用什么样的表结构在关系数据库中存储已记忆的函数参数和结果?

Database design 应该使用什么样的表结构在关系数据库中存储已记忆的函数参数和结果?,database-design,memoization,Database Design,Memoization,给定返回标量值的n个变量的昂贵函数: f(x1, x2, ..., xn) = y 如果我希望在关系数据库中记住这个函数,我应该使用什么样的表结构,应用什么样的数据建模方法 (相关但从不同角度:)根据“n”的值,您可能可以这样对其建模。假设“n”的值为137 create table expensive_function_of_n_vars ( x1 integer not null, x2 integer not null, ... x137 integer not null

给定返回标量值的n个变量的昂贵函数:

f(x1, x2, ..., xn) = y
如果我希望在关系数据库中记住这个函数,我应该使用什么样的表结构,应用什么样的数据建模方法


(相关但从不同角度:)

根据“n”的值,您可能可以这样对其建模。假设“n”的值为137

create table expensive_function_of_n_vars (
  x1 integer not null,
  x2 integer not null,
  ...
  x137 integer not null,
  primary key (x1, x2, ..., x137),
  result integer not null
);
在正常情况下,我不愿意在不包含CHECK()约束的情况下存储结果,以确保它是正确的结果。在你的情况下,这可能是不实际的,但无论如何你应该考虑一下

这假设每一列都有某种意义。也就是说,我假设,在真正的问题域中,这些列中的每一列都有一个比“x3”更有意义的名称

例如,在您引用的文章中,OP使用“高度”、“宽度”和“深度”。在某些应用程序中,这些维度是不可交换的——您可以明确地识别真实世界对象上的哪个维度是高度、哪个维度是宽度、哪个维度是深度。(一个例子可能是托盘上的运输集装箱,其中高度很明显,宽度是叉车需要放置的边缘,深度是剩余的尺寸。)在其他应用中,它们是可交换的,这意味着您可能会找到像{2,3,5}和{2,5,3}这样的“重复”主键。在这种情况下,您可能需要将参数从最低到最高排序,并使用CHECK()约束来确保它们是有序的


这只是直接的标准化,需要注意的是,在这种情况下,我认为您是从6NF开始的,所以没有太多事情要做。

首先,DBMS不一定是处理记忆的最佳选择。只有当结果的数量太大而无法放入RAM中,或者结果需要长时间持久化,或者需要跨多个(可能是并发的)客户端重用时,这种方法才是合理的

对于每个函数,创建一个单独的表,其中包含对应于函数输入和结果的列。在输入上创建PK

在评估功能之前(在
value1
value2
value3
上),请执行以下操作:

表示绑定参数,某些DBMS可能使用不同的前缀)

  • 如果你得到结果,就使用它。函数之前已计算过,您可以跳过这次的计算
  • 如果没有得到结果(即零行),请评估函数并存储输入和结果,以供以后重用。考虑在后台线程上执行这个插入,这样您就可以在主线程上使用结果而不用等待数据库。
通过为每个函数使用单独的表和带有绑定参数的静态定制查询,您可以利用它获得更好的性能

也可以考虑(如果DBMS支持它),直接从B-树结构中获取结果,避免表堆查找的需要。

SELECT result
FROM function_table
WHERE
    input1 = :value1
    AND input2 = :value2
    AND input3 = :value3
    ...