【问题标题】:What kind of table structure should be used to store memoized function parameters and results in a relational database?应该使用什么样的表结构来将记忆函数参数和结果存储在关系数据库中?
【发布时间】:2012-06-21 22:53:44
【问题描述】:

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

f(x1, x2, ..., xn) = y

如果我想在关系数据库中记忆这个函数,我应该使用什么样的表结构,以及应用什么样的数据建模方法?

(相关但从不同的角度:What kind of data model models function parameters and results?

【问题讨论】:

    标签: database-design memoization


    【解决方案1】:

    根据“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 开始的,所以没什么可做的。

    【讨论】:

      【解决方案2】:

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

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

      在评估函数之前(value1value2value3...),请执行以下操作:

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

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

      • 如果您得到结果,请使用它。该函数之前已评估过,这次您可以跳过评估。
      • 如果没有得到结果(即零行),请评估函数并存储输入和结果以供以后重用。考虑在后台线程上执行此 INSERT,这样您就可以继续在主线程上使用结果,而无需等待数据库。

      通过为每个函数使用单独的表和带有绑定参数的静态定制查询,您可以利用query preparation 获得更好的性能。

      另外,请考虑clustering the table(如果您的 DBMS 支持),直接从 B-Tree 结构中获取结果并避免表堆查找的需要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-29
        • 2010-11-01
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        • 2018-10-28
        相关资源
        最近更新 更多