10种不可以使用关系数据库的场景

如何根据业务选择不同的技术架构,这是一个方向战略性问题,我在论支付宝与12306的业务类型可比性是从OO分析方式进行论证,但是更多时候我们很多人基本都是从关系数据库的设计开始项目的第一步,这篇文章:
10件不可以使用关系数据库的场景:10 things never to do with a relational database | Application Development - InfoWorld也许能够对普通人起到方向提醒作用。

大意翻译如下:
1.搜索: 即使Oralce商店自己也不使用Oracle Text, 但是你会看到很多人使用复杂的like之类查询语句,这是非常丑陋的,兼容性相当差,Oracle数据库获得数据的过程是艰难的,除了Oralce以外,其他数据库几乎没有真正的搜索扩展。推荐使用类似Hibernate Search, Apache Solr, or even Autonomy.能有更好地性能。

2. 推荐: 这是很多电子商务产品最丑陋的地方,他们获取关于用户的许多数据,然后试图进行推荐。考虑一个社交网络场景下,如果你的朋友买了袜子,我也推荐袜子给你,这是从RDBMS中获得的数据,我们会使用Join表等SQL语句多层次查询,这在Neo4J之类图库中只需要两行即可。你可以在社交系统中使用关系数据库,但是会失去天然的实时性。


3. 高频交易:我们大多数人都认为交易系统必须RDBMS,因为它能保证事务性,对吗?错了. 高频交易者往往是采用NoSQL的第一批人,对于HFT低延迟为王(低延迟意味快速响应,特别是大访问量情况下快速完成用户交易),当然,你可以进行高难度篮球投篮,你也能使用关系数据库完成低延迟,但是关系数据库真的不是为这个目标设计的。.

Oracle试图否定上面的结论,他通过购买TimesTen, 试图将基于内存数据库和RDBMS结合, 但是你会捡了芝麻丢了西瓜,我们看到HFT大部分使用key-value存储,泪如Riak,甚至更复杂如Gemfire.

[该贴被admin于2012-11-16 15:46修改过]

4. 商品分类编目: 使用SQL来映射商品不是一件令人愉快的事情,当我为一家移动电话商家服务,商品是手机,除了标准模型以外还有几种不同性质的手机,在不同市场下都不同的名称,同样的模型可以有完全不同的部件。管理这些扁平化数据很方便的工具我比较喜欢图库类如:Neo4j.

在一个化工企业我还有类似的经验,我们对产品进行了非常吃力愚蠢的字符串映射,但是将产品信息保存在图库中就非常简单方便,即使使用文本数据库如CouchBase 2.0 or MongoDB也还可以。

5. 用户/用户组和权限ACL: 在某个程度上讲, LDAP是最原始的NoSQL数据库,LDAP是为用户权限设计的。可惜当技术发展LDAP成为过去时,开发人员只好使用创建数据表的方式来欺骗蒙混过关。在企业软件中,User表和Role表方式不能再这样走下去了。

6. 日志分析: Hadoop 或是和小型集群的 RHQ/JBossON 是一个好的选择,将除了错误以外日志截获到这两个系统中,做一件很复杂的事情,生活将变得更糟糕(苦逼程序员有时可能是自找的),非结构化数据正是 MapReduce强项,可以使用PIG之类方便操作,但是主流系统监控工具大部分是基于RDBMS,实际上日志分析真的不需要事务,低延迟才是第一追求。

7. 媒体库: 使用关系数据库存储元数据也许还可以(其实最好还是使用文本数据库Couchbase 2.0 or MongoDB), 但是BLOBs类型数据已经维持痛苦经历很长时间,你最好使用分布式存储或集群式的文件系统来保存图片和其他二进制数据,很不幸,很多CMS内容管理系统工程师还是将它们保存到RDBMS.

8. Email: 电子邮件是带有元数据的现代非结构化数据,我们尽可能优化 RDBMS,使用 BLOBs字段做很疯狂的事情, email是关于元数据 搜索 内容,这其中没有任何关系代数,也不需要事务,文件系统就很好,而元数据可以保存在文本数据库。

9. 分类广告: 一个高伸缩 大批用户展示,短小内容,使用文本数据库MongoDB. 最终一致性足够了。

10. 时间系列time-series 有关预测等(大数据分析): 这是最普遍的10个,但它有多种形式,从商品到金融工程师和太阳黑子的天气。有关时间方面的应用对于关系数据库只是一个传说。如果时间是你主要关心的业务核心,那么使用MapReduce-friendly列族比如Cassandra 也许是一个好的解决方案,Datastax 已经针对Cassandra 发布了其时间系列的数据。

2012-11-16 14:50 "@banq"的内容
4. 商品分类编目: 使用SQL来映射商品不是一件令人愉快的事情,当我为一家移动电话商家服务,商品是手机,除了标准模型以外还有几种不同性质的手机,在不同市场下都不同的名称,同样的模型可以有完全不同的部件。管理这些扁平化数据很方便的工具我比较 ...

这个深有体会,在不同市场下都不同的名称,对生产制造结构特征没有影响,纯粹是为了销售需要,模型可以有完全不同的部件,这是部件之间的可选关系,还有就是相同部件不同特征的可选关系,部件之间的依赖可选关系,部件特征的依赖可选关系,这个产品模型会很复杂, SQL来映射是很麻烦,但不是没法实现。。

2012-11-17 22:35 "@clonalman"的内容
这个深有体会,在不同市场下都不同的名称 ...

是啊,我看到你在业务建模:BoundedContext(有界上下文)举例Product中也说明这个问题。模型复杂多变,带来的持久也不方便,一旦改变起来修改维护也不方便。图库Neo4J实际是一个很好的对象化持久方式,至少熨平了一些过去对象和关系数据库阻抗。

2012-11-18 09:27 "@banq"的内容
是啊,我看到你在业务建模:BoundedContext(有界上下文)举例Product中也说明这个问题。模型复杂多变,带来的持久也不方便,一旦改变起来修改维护也不方便。图库Neo4J实际是一个很好的对象化持久方式,至少熨平了一些过去对象和关 ...


如果再进一步延伸,部件之间除了数量特征的约束之外,还需要生产装配顺序、损耗工时,加上生产工艺、工作中心、资源约束,相信就不是Neo4J所能解决的,还是得回归关系数据库

2012-11-18 20:22 "@clonalman"的内容
相信就不是Neo4J所能解决的,还是得回归关系数据库 ...

能否详细解释之?

2012-11-18 21:44 "@banq"的内容
能否详细解释之? ...

主要是关系的深度,图数据库(Neo4J)只支持一层关系,而关系数据库可支持无限层次,不知道理解的对不对?
Neo4J怎么表达Relationship之间的Releationship?我看Neo4J相关的例子都是一层的扁平化的结构,所以这种数据库应用范围还是很有限的,哪天有空我找个把Product的例子再拓展一下,看Neo4J能不能存储与遍历?

2012-11-21 15:36 "@banq"的内容
Modeling a multilevel index in neoj4。 ...



START root=node:node_auto_index(name = 'Root')
MATCH
commonPath=root-[:2011]->()-[:01]->commonRootEnd,
startPath=commonRootEnd-[:01]->startLeaf,
endPath=commonRootEnd-[:03]->endLeaf,
valuePath=startLeaf-[:NEXT*0..]->middle-[:NEXT*0..]->endLeaf,
values=middle-[:VALUE]->event
RETURN event.name
ORDER BY event.name ASC


我只是粗略看了一下这个图数据库,能解析一下这个Index吗?
感觉这个查询特性不是我想要的特性。

startLeaf-[:NEXT*0..]->middle-[:NEXT*0..]->endLeaf
startLeaf、middle、endLeaf都是node
[:NEXT*0..]之间的relationship对吧,我不想要node之间的遍历查询,
而是想看到[:NEXT*0..]之间的遍历导航关系。

一层Relationship1:ALeaf->[:NEXT*0..]->BLeaf (这是node之间)
二层Relationship2:“ALeaf->[:NEXT*0..]->BLeaf ”与“CLeaf->[:NEXT*0..]->DLeaf ”(这是relationship之间)

请问:使用图数据库如何存储和遍历relationship2?


[该贴被clonalman于2012-11-22 01:54修改过]

2012-11-21 19:34 "@clonalman"的内容
使用图数据库如何存储和遍历relationship2 ...

我是这样想,不知有没有道理:图库实际是一种树形结构,树分枝和叶,是否可以用枝Node来表达一个relation,将relation包装成Node,类似包装成对象一样,它是否是在用另外一种方式来表达关系呢?而如果采取关系数据库Join方式来表达关系,虽然灵活强大,但是丧失了可伸缩性,图库这种方式可伸缩性很强,可以不断线性增加服务器提高处理能力。

2012-11-22 07:54 "@banq"的内容
我是这样想,不知有没有道理:图库实际是一种树形结构,树分枝和叶,是否可以用枝Node来表达一个relation,将relation包装成Node,类似包装成对象一样,它是否是在用另外一种方式来表达关系呢?而如果采取关系数据库Join方式来表 ...

是的,Relation退化为Node,这个图数据库与关系数据已经没什么区别了,其实我想要的不是结点之间的关系,而已一个结点于一个数之间的关系或两棵树之间的相互关系.

举个例子,我们的手机,它的配件可能是机身、电池、SD卡、耳机、手机帖膜等,一般来说,机身、电池是必须件,SD卡、耳机、手机帖膜是可选件,如果我机身的ROM只有1G,装完操作系统、常用软件就什么空间,这时候SD卡可能就变成必须件了,当我的手机是16G的,SD卡就是可选件; 用树来表达手机的组成那是相当给力,但是如何表达node的property对整个树结构的影响了?(SD卡由可选件变为必须件,手机的产品BOM已经发生了变化了,这只是一个简单的例子,实际业务就没这么简单)

2012-11-22 12:47 "@clonalman"的内容
如何表达node的property对整个树结构的影响了 ...

存储property适合使用Ke-value的NoSQL,或列族如HBase等,不同NoSQL适合不同的数据结构,不能象关系数据库打包天下了。

2012-11-23 07:55 "@banq"的内容
存储property适合使用Ke-value的NoSQL,或列族如HBase等,不同NoSQL适合不同的数据结构,不能象关系数据库打包天下了。 ...

节点、节点属性与整棵树的关系,两棵树之间的关系,图数据库如何描述存储?

2012-11-24 10:29 "@clonalman"的内容
节点、节点属性与整棵树的关系,两棵树之间的关系 ...

我是这样思考,你看对不对,因为NOSQL多样化,我的思考边界就不限定在一个图库或Key-value思考,而是从数据或者说对象高度去思考。

Property属性是值,其有Key,这个Key和图库的Node的Key是一样的值,比如:

Class Product{
Long Id; //Key
Collection props;
Catalog cat;
}
我们可以把 Long Id; 和 Collection props;保存到Key-value数据库;而把Long Id; Catalog cat;保存到Neo4J图库。