在RavenDB中存储和评估表达式

时间:2014-11-25 20:37:38

标签: ravendb

我正在开发一个最终用户设计表单的应用程序,这只是一个简单的表格。用户可以定义行和列的编号,并为每个单元格设置一些属性。所以它有点类似于电子表格。然后,用户创建报告。表单用作报告的模板,报告必须遵守表单结构,并允许用户在单元格中输入值。每个报告都必须有一个,而且只有一个表单。棘手的部分是用户可以将表单中的任何单元格定义为涉及表单中其他单元格的算术表达式。同样,类似于在电子表格中编写公式。使用此表单的报表不允许用户输入带表达式的单元格的值,但必须通过计算表达式自动计算单元格的值。我需要在多用户数据库中存储表单和报表。用户可以随时更改表单。如果他更改了一个或多个单元格的表达式,则必须相应地重新计算基于此表单的所有报表。数据库必须能够处理数十种表单和数百万份报告。

C#中的简单域模型如下:

enum CellType { Value, Expression }

class FormCell : 
{
    public int Column { get; set; }
    public int Row { get; set; }
    public CellType Type { get; set; }
    public bool Mandatory { get; set; }
    public double NumericalValue { get; set; }
    // Holds the expression
    public string Formula { get; set; }
    ...
}

class Form : 
{
    public string Name { get; set; }
    public FormType Type { get; set; }
    public List<FormCell> Cells { get; set; }

    public Form()
    {
        Cells = new List<FormCell>();
    }
}

 class Report : 
{
    public Form Form { get; set; }
    public List<FormCell> ValueCells { get; set; }

    public Report(Form form)
    {
        this.Form = form;
        // Copy the value cells (cells with constant values, not expressions) from the form to the report
        this.ValueCells = new List<FormCell>(form.Cells.Where(c => c.Type == CellType.Value)).ConvertAll(c=>new FormCell(c));
        // TODO: Figure out how to evaluate cells with expressions
    }
}

由于没有事先暴露于NoSQL数据库,我开始关注通常的关系数据库路径,存储过程和动态SQL,正如可以预料的那样,这是一场噩梦。我对RavenDB印象非常深刻,我想知道这是否可以在RavenDB中完成,如果是这样,究竟是怎么回事?谢谢。

0 个答案:

没有答案
相关问题