我的团队正在构建一个必须解决许多用户定义公式的应用程序。它替代了我们客户使用的庞大电子表格。例如每个公式(大部分)使用简单的算术运算和一些数学函数。我们正在使用一个称为Parsii的表达式评估库来进行实际的公式评估。但是在所有公式中,我们必须按其依赖公式的顺序对其进行评估。例如。
F1 = a + b
F2 = F1 * 10%
F3 = b / 2
F4 = F2 + F3
在上面的示例中,b是用户输入的值。系统最初应计算F1和F3,因为它们直接取决于用户输入。然后应计算F3。最后是F4。
我的问题是,建议使用哪种数据结构来建模公式评估的这些依赖性?
我们目前将其建模为DIRECTED GRAPH。在上面的示例中,F1和F3是根节点,F3连接到两者,F4连接到F3,F4是叶节点。我们使用了Tinkerpop3图形实现对此进行建模。
用于对此建模的任何数据结构应具有以下特征。 -易于更改几个顶级根节点的一些输入数据(基于用户输入) -仅重新计算那些依赖于已更改的根节点的公式(因为我们在特定的计算上下文中有100多个公式,并且必须在1-2秒内回复到GUI层) -尽量减少通过一些现有库创建数据结构的代码量。 -能够通过各种键(公式对象的名称,对象的ID,年份等)查询数据结构以查询/查找根节点,并且能够编辑这些键的属性。
答案 0 :(得分:0)
您当前将其存储在平面文件中吗?
如果希望具有更好的查询性和更轻松的修改,则可以将其作为DAG存储在数据库表中。
也许是这样(我希望实际的解决方案有所不同):
+-----------------------------------------------------------+
| FORMULA |
+------------+--------------+----------------+--------------+
| ID (PK) | FORMULA_NAME | FORMULA_STRING | FORMULA_YEAR |
+============+==============+================+==============+
| 1 | F1 | a + b | |
+------------+--------------+----------------+--------------+
| 2 | F2 | F1 * 10% | |
+------------+--------------+----------------+--------------+
| 3 | F3 | b / 2 | |
+------------+--------------+----------------+--------------+
| 4 | F4 | F2 + F3 | |
+------------+--------------+----------------+--------------+
+--------------------------------------+
| FORMULA_DEPENDENCIES |
+-----------------+--------------------+
| FORMULA_ID (FK) | DEPENDS_ON_ID (FK) |
+=================+====================+
| 2 | 1 |
+-----------------+--------------------+
| 4 | 2 |
+-----------------+--------------------+
| 4 | 3 |
+-----------------+--------------------+
使用此方法,您还可以轻松地知道某个公式是否依赖于不存在的公式,因为它会违反DEPENDS_ON_ID
外键。数据库还可以检测是否有任何公式形成了依赖循环。例如F1取决于F2取决于F3取决于F1。
此外,您可以轻松地将所需的任何元数据添加到表中,并在可能要查询的内容上建立索引。