免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 47533 | 回复: 1
打印 上一主题 下一主题

(转)“不可变”的数据库,函数式数据库Datomic [复制链接]

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-09 17:18 |只看该作者 |倒序浏览
本帖最后由 pprpg 于 2013-08-31 14:22 编辑

http://www.infoq.com/cn/news/2013/06/database-value



在QCon New York 2013上,Rich Hickey做了一次话题为函数式数据库的演讲。Hickey因创造了Clojure编程语言而蜚声业内,目前他正在开发函数式数据库Datomic。在他的演讲中,Hickey表示函数式语言中的两个非常有用的属性:数据即值(data as values)和纯函数(译者注:Pure Functions ,不会产生副作用的函数,副作用指的是函数会改变外界环境的某些属性,或者返回值依赖于外部环境的某个属性),同样也有适用于数据库这一环境。他认为,这与对象关联的编程有很大不同。对象包含了数据和逻辑,就像是一台机器:它顺序地进行处理并不断改变自己的状态。每次调用对象上的方法都有可能返回不同的结果。这种状态可能会以某种不可预知的方式进行改变。例如,由于另一个线程同样也引用了该对象并修改了它。这让与对象关联的程序很难进行对结果的推断。而我们今天所使用的数据库与对象非常相似:一个数据库服务器就是一个不断改变状态,并且具有查询逻辑和变化部分的单独实体(有可能存在多份复制),可以采用事务的概念来弥补对数据库不可变(immutable)值的缺失。

Hickey以反问的口吻向观众说道:“如果将所有这些函数式的属性应用到数据库上岂不是很好?”在这样的一个世界里,整个数据库将可以代表一个(不变)值,而查询就好比是以一个或多个数据库作为参数的函数。这样一来,数据库便可以在多个线程间被安全的传递,而在相同数据库值上进行的相同查询将会产生相同的结果。自然地,由于一个不可变的数据库对大家来说并不是很有用处,所以我们将会使用事务处理器(transactor)来产生变更,更准确地说是:基于先前的数据库值产生新的数据库值。给定事务处理器一个数据库值和变化的数量,它将会返回一个新的数据库值。程序可以在任何时间向数据库索取它的当前值。Datomic 就是一个拥有这些属性的数据库。

这种针对数据库的函数式方式应用了函数式编程的核心思想,即严格地将数据库的数据和逻辑进行区分。数据被持久化在默默无闻的数据存储上,甚至可以存储在像Amazon的DynamoDB这样的简单键值存储上。事务处理器进程将会对事务进行协调,并且在出现多个“节点(peer)”(Datomic对客户端的叫法)于同一时间执行事务时起到主要的作用。通常节点会以Java库的形式集成到应用当中。一个节点会与事务处理器建立起一个连接来执行事务性的变化。查询会由节点本身来执行,并根据实际的需要来进行延迟(lazily)数据加载。为了使查询更加简单,Datomic支持以Datalog作为查询语言,该语言是Prolog的一个子集,非常适合以声明式的方式进行数据库查询。

关于Datomic的更多信息可以访问它的官方网站。InfoQ曾经发表过Datomic的架构与数据模型的文章,并且同样发表了上文所提到的关于Datomic的演讲视频。

查看英文原文:The Database as a Value

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2014-11-29 22:50 |只看该作者
本帖最后由 yulihua49 于 2014-11-29 23:09 编辑

回复 1# pprpg

这种不可变的数据库可能天生的不适合某些交易,比如卖火车票。
一个席位的票,一开始是空闲状态,就是可售。然后100个人来抢,他们都抢到了,生成了100个新记录,状态都是“占用”,占用者分别是自己。
付款后又生成了100个新记录,状态是“售出”。这一个座位就卖给100个人啦。他们上车时需要带上警察和律师,来证明自己是唯一合法的乘客。

这个业务的数据库是天生的有副作用的函数,因为你每次按相同的条件查询余额,都会有不同都结果,票是越卖越少。
实际上,如你的数据库在描述客观世界,它就必须是不断变化的,你对世界对每次探寻,即使条件相同,结果也势必不同,不是有个测不准原理吗?
对于现实对状态机,你想用非状态机来描述?

所以,无副作用的函数不能适应所有的需求,它不是功能完备的。
有副作用的函数也不是什么坏事。

我认为这种概念没什么实用价值。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP