F#数据类型+ SQL-Server持久性(使用No-SQL技术)

时间:2017-01-31 03:27:21

标签: f# f#-data xml-database

我的F#应用程序具有非常好的F#模型,充分利用了F#类型系统(联合,记录,元组和基元类型)。我正在尝试找出将这些数据类型保存到SQL-Server数据库的最佳方法。

让我们做出以下假设:

  • 我想要坚持的中心实体是一个名为Task的歧视联盟,它有大约30个不同的联合案例,每个案例都有完全不同的属性(可能是其他的DU,记录或元组或者原始类型),这使得使用矩形关系表非常繁琐,无法实现

  • 我希望每周多次不断改进这些模型,CI设置为在提交后立即将我的应用部署到生产中。同样,使用常规表会使ALTER TABLE语句减慢我的开发和部署速度,并增加相当多的认知过载,任何新开发人员都会在这个系统上发现具有挑战性的

  • 在进行模型演变后,我应该可以轻松地使用后台进程在线升级我的旧模型,或者从数据库中取出时,使用接近0的停机时间

  • 我应该可以在任意深度查询这些模型,而且我已经有近百万行需要处理,而且这种情况会继续增长。查询应该很快,最多为百毫秒

  • 我需要使用SQL Server,因为此应用程序只是较大系统的一小部分,我希望任何数据库操作都能参与任何正在进行的数据库事务

Task序列化为JSON

这是我的第一次尝试 - 将所有内容存储为JSON,识别可查询值,使用SQL Server 2016的新JSON函数将它们存储在索引表中。 SQL Server中的JSON函数非常快,但索引这些查询需要我使用持久+计算+索引列或索引视图。

烦恼:

  • 非常难以进化模型,特别是如果我想要进化所有类型X的实例,这些实例可能出现在不同联合情况的不同深度。没有标准化的语言可以指出这些演变

  • JSON不区分十进制/浮点数/数字,这有时很难处理,我需要自定义格式化程序。小问题,没什么大不了的。

  • 查询语言在任意深度都有些原始,并且这些查询没有编入索引,因此新查询几乎总是要求我创建计算列或更改索引视图。

  • 将新索引列添加到索引视图不是ONLINE操作并导致停机,并且很难在CI中自动化

  • 在同一个表中使用PERSISTED COLUMNS有时会导致SQL Server在搜索/选择时没有真正使用它们,而是从头开始重新计算这些值(因为它不能准确地计算出这个操作的成本)以及它的查询计划器)

Task序列化为XML

这是我目前的实施。

  • 我编写了自己的自定义XML序列化程序,这使我很容易使用XQuery和SQL Server的xml数据类型列查询数据库

  • 使用极其强大的XSLT

  • ,模型演变变得轻而易举

问题:

  • 查询,即使添加了所有可能的XML索引也很慢 - 大约需要5秒钟(在Azure P6 SQL实例中)
  • 将此与针对不同持久模型版本的略有不同的查询相结合,并使其更加昂贵
  • 非索引XML函数非常慢,构建索引表/持久列需要花费很长时间,因此我无法真正使用它。

我对我的XML解决方案非常满意 - 我只需要一种方法来加快我的XML查询,而且我认为在这一点上,我已经达到了SQL Server可以提供的极限。

我是否还有其他方法可以忽略F#社区试图保留非常丰富的F#数据模型?

0 个答案:

没有答案