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

2019-03-27 01:11|来源: 网路

如何根据业务选择不同的技术架构,这是一个方向战略性问题,我在论支付宝与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.

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 发布了其时间系列的数据。

 

http://www.jdon.com/44719


转自:http://www.cnblogs.com/heartstage/p/3418678

相关问答

更多
  • nosql 当年是为了处理 杂乱的非结构化数据来设计的 比如 网页访问信息 那就如楼上说的 阉割了sql 的 acid 特性 这样当然快了啊 比如插入数据 相反如果是一些 交易数据 数据的安全稳定 压倒一切的时候 rdbms 就显现威力了 但是rdbms 在面对nosql的 一些挑战之后 大力优化了 对于一些 非结构化数据的支持 比如json 数据 同时rdbms 对于 olap and oltp 的支持 也要比 nosql快的你是一点半点 总结就是 世界上那有一定好的东西 mongodb 是最好的 nos ...
  • 答案是B,关系表结构
  • 一般有关系数据库和桌面数据库,关系数据库一般用的是mssql oracle mysql等,桌面数据库有access sqlite等
  • 最简单的方法是禁用外键检查,然后截断表格。 由于外键已禁用,因此截断表的顺序无关紧要。 set foreign_key_checks = 0; truncate table parent; truncate table child; truncate table ... 您甚至可以使用information_schema为您生成截断表语句。 像这样的东西: select concat('truncate table ',table_schema,'.',table_name,';') as sql_stm ...
  • 如果每个人当时只有一个激活哈希活动,那么将它存储在与用户相同的表中是可行的。 但是,分离它的一个优点是用户在短时间内只有一个激活哈希值,因此为了使用户记录更小,您可以将哈希值存储在单独的表中。 保持用户记录较小使其保持更高的性能。 在这种情况下,您将没有active列。 你只需删除非活动的哈希值。 如果确实将激活列存储在用户表中,请确保按名称选择列。 例如,在大多数情况下,您需要这样做: SELECT id, first_name, last_name, email, password FROM users ...
  • 简答:是的。 正如JLo在上面的评论中所说,在设计数据库结构时,你不应该主要考虑安全性; 主要考虑数据存储的效率(即规范化)。 如果黑客可以进入你的数据库,那么无论他们可以访问哪个表,这都是一个问题。 因此,就安全性而言,首先将注意力放在防止注入和数据库攻击方面。 试图将数据分成不同的表格以保护其免受黑客攻击,就像将您的黄金存储在十个不同的银行金库中以防止银行抢劫; 它通过默默无闻的安全性,并且对你的每一步都有抵触作用。 相反,就安全性而言: 如果已经编写了服务器代码,请为其进行安全审计。 专家可以向您指出 ...
  • 确实,当前版本的MySQL不会强制执行在MyISAM表上定义的外键约束,但这并不意味着不能在这些表之间创建关系 (毕竟,这只是保存在一个表数据中的问题)标识另一个表中的相关记录):必须更加小心地正确管理它们。 如果强制执行ACID合规对您来说很重要,那么InnoDB就是您的选择; 如果您可以牺牲这种合规性以换取在某些情况下提高性能,那么MyISAM可能值得一看。 如果需要,您甚至可以混合和匹配同一数据库中的两个存储引擎以实现平衡。 有很多资源讨论MyISAM与InnoDB的优缺点 - 只需在Google(或 ...
  • 您可以使用RLMArray,其中RLMArray是Realm中用于定义多对多关系的容器类型。 正如官方Realm文档中提到的目标c检查示例一样。 也可以通过这个链接来帮助RLMArray doc You can use RLMArray , where RLMArray is the container type in Realm used to define to-many relationships. As mentioned in the official Realm documentation fo ...
  • 我认为你几乎拥有它。 现在,我建议将Events_has_Users表重命名为Users_Attending_Events,因为这会更清晰。 在这张表上,主键将是Users_UserId和Events_EventsId,它们实际上是外键。 主键和外键在Workbench中自动完成。 这不需要Events Organizer,因为它在事件表中被定义为外键(Organizer)。 这是一个更清晰的演绎。 只需填写其他字段: 在表Events中,users_id是组织者(一个外键)。 I think you al ...
  • 我假设你正在使用Neo4j,因为你的问题有Neo4j标签。 如果您想要将数据从Neo4j导出到关系数据库,您可能需要考虑使用CSV文件作为中间步骤,因为许多关系数据库具有CSV导入工具。 我过去曾为此目的使用过neo4j-shell工具扩展 。 此外, 这是最近一篇关于将数据从Neo4j导出为CSV格式的博客文章。 I'll assume you are using Neo4j since your question has the Neo4j tag. If you are wanting to expo ...