作者:AngryFox 分类: Uncategorized July 19th, 2014 暂无评论

线性扩展的数据库
分布式部署。数据必须分布到多台机器上去。
无表连接(Joinless)。至少在数据存储层次上,不能使用表连接(Join),也不要定义关联完整性约束。
去正规化。避免使用表连接,就会有很多去正规化工作。
无事务。不能按事务方式操作。
需求:实时快速的键/值检索;
非实时的复杂查询主要在运营和维护时进行;
分布式的应用,从而数据也必须分布;
高容错性;
动态重新配置;
复杂对象。

复杂值。Mnesia以自然有效的方式支持复杂值的操作(换言之,通过一次检索操作)。“以第三(甚至是第一)范式组织电信数据通常
不太可能。”列里可以存储复杂值就意味着不再需要表连接。
数据格式和地址空间。此数据库管理系统运行在应用的地址空间里。这就允许检索返回对象指针,而不需要在不同数据格式之间暗地转
换对象,或者通过连线去操作对象。论文提及到Erlang中一个应用即使崩溃也不会影响到数据库,这克服了这种方式下应用的崩溃有可
能影响数据库的常见诟病。“Erlang进程的效能有一个优势,运行在同一个地址空间但是不可能直接读取或者写入其他进程的存储空间
。”
容错。数据表可以被复制到多个计算节点中。事务上下文中的写操作会被应用到所有副本,通过恢复时更新,当时宕机的副本也能够被
更新。“这个机制使得多个地理上分开的系统联合提供一个连续运行的不停机系统设计成为可能。”
分布和位置透明。应用开发者能够透明访问数据表——无论远程的还是本地的,还是数据表副本。不过在性能关键的地方,也有办法获

知数据表的位置,并且让代码在尽量靠近事发数据的位置执行。
事务和ACID。Mnesia支持ACID(A=原子性,C=一致性,I=隔离性,D=耐久性),不过也提供仅限于内存的数据表操作能力(以牺牲耐久

性为代价)。
绕开事务管理器的能力。“脏接口(dirty interface)”的概念被作为一个轻量级加锁机制引入,从而避免使用事务管理器的额外开销
。这个能力对性能关键的操作比较有用,比如检索一条记录。“这些脏操作 是真正的实时数据库操作:无论数据库是大是小,他们都消

耗可以预测的执行时间。”
查询。查询通过被称为“列表领悟(List Comprehension)语法”的方式表达。例如,要找到子女多于X个的人,表达式可以写成:

query [P.name || P < table(person), length(P.children) > X] end.
Schema的修改。Erlang语言自身既支持不停止进程情况下修改运行中进程代码的能力。这就允许Mnesia数据库动态的修改
Schema。“Mnesia既然是为不停机应用设计的,所有系统活动比如备份、修改Schema、导出表数据到二级存储, 还有副本复制都必须在
后台进行,同时允许应用和平常一样访问和修改数据表。”

1、创建schema
在一个节点上,通过 mnesia:create_schema(NodeList), 在整个集群中,创建空的schema。NodeList指定了集群中所有的节点。
注意:
1)、schema只能创建一次
2)、实际上,每个节点都保存一份schema拷贝

2、 创建表
在一个节点上,通过 mnesia:create_table(),则创建一个分布式的表。
mnesia会自动将该表同步到节点中其它节点上。
每个节点,实际上还是维护的本地的一个表。

3、 分布式的插入、删除、修改、查询操作。
在任意一个节点上进行如上操作,都会同步反映到集群中的其它节点上。

4、 事务和脏操作。
事务是同步的操作,性能低,但能确保一致性。
脏操作不能保证一致性,但是速度极快。

5、 change_config

适合单线程的场景:单个线程的工作逻辑简单,而且速度非常快,比如从内存中读取某个值,或者从Hash表根据key获得某个value。
Redis和Node.js这类程序都是单线程,适合单个线程简单快速的场景。
适合多线程的场景:单个线程的工作逻辑复杂,等待时间较长或者需要消耗大量系统运算资源,比如需要从多个远程服务获得数据并计
算,或者图像处理。