Database design NoSQL或关系型或两者兼而有之

Database design NoSQL或关系型或两者兼而有之,database-design,nosql,scalability,Database Design,Nosql,Scalability,我正在做一个项目,在那里我必须保存朋友列表。经过深思熟虑,在网上搜索,最好的方法似乎是将用户id和朋友id保存在一个表中。 但可以肯定的是,若该项目预计达到大规模,这种方法似乎不是很好。 谷歌、Facebook、Twitter等大多数大型公司也将其功能转移到了nosql数据库上。 那么,我们是否应该从这些NoSQL数据库开始我们的项目呢 但同时我也读到NoSQL中有很多编码工作,因为这里没有提供关系数据库中的许多默认服务(如果我错了,请纠正我) 也许有一种方法可以从关系型开始,因为它在小范围内具

我正在做一个项目,在那里我必须保存朋友列表。经过深思熟虑,在网上搜索,最好的方法似乎是将用户id和朋友id保存在一个表中。 但可以肯定的是,若该项目预计达到大规模,这种方法似乎不是很好。 谷歌、Facebook、Twitter等大多数大型公司也将其功能转移到了nosql数据库上。 那么,我们是否应该从这些NoSQL数据库开始我们的项目呢

但同时我也读到NoSQL中有很多编码工作,因为这里没有提供关系数据库中的许多默认服务(如果我错了,请纠正我)

也许有一种方法可以从关系型开始,因为它在小范围内具有非常好的功能,然后再转到NoSQL,但为此,您必须编写非常好的可移植代码,ORM是否可以发挥良好的作用

想了解其他人对此的正确方法的意见吗?

使用SQL数据库


当你开始每天拥有数百万用户时,就开始使用某种NoSQL数据库。

我认为ORM对你没有多大帮助,NoSQL数据库的原理与关系数据库的原理完全不同。因此,一旦您开始使用关系模式,并在模式中投入大量精力,并使用它的优点(如外键),您就必须努力将其移动到nosql。反过来也一样

您提到的大公司正在使用nosql,因为它提供了高吞吐量和简单的数据库模式,同时考虑到它缺乏关系数据库提供的一些高级功能

对于他们的帐户,他们使用的是关系数据库,我敢肯定:-)

最后,它将取决于模式的复杂性:如果它足够简单,请尝试nosql:更容易设置,实际上您根本不需要定义模式,您只需设置记录(或一些人称之为文档)并保存它。如果您改变了对表结构的看法,则无需更改表:只需保存数据即可。很简单:这就是为什么今天会这样


但是没有引用完整性,对于事务也有一些限制,不是所有的都支持。因此,如果您在数据库模式、数据完整性、事务方面需要更多,请选择关系数据库。

一般不要使用ORM,特别是ActiveRecord
他们通常会产生“开发债务”,这意味着项目的开始看起来很容易
当您投资于与ORM的完全集成并且项目的80%完成时,
您开始看到ORM失败的所有边界情况

除此之外,大多数ORM都会进行次优查询,从不利用特定于引擎的特性

至于SQL和noSQL:我建议从SQL数据库开始,然后当应用程序增长时,开始使用一些缓存策略(memcached,或者redis)。只有当解决方案用尽时,才开始寻找数据库逻辑中不需要关系的部分

noSQL数据库提供了一个非常特定的用例列表,并不适用于一般的应用程序。

edit 我看到其他人建议从SQL开始。我想改变我的主张,并说——尝试一些小规模的项目,如“小型twitter克隆”或“存储视频磁带”。将数据库保存在多个节点上,并编写脚本,这样会使数据泛滥。使用Riak/Cassandra,然后使用一些SQL解决方案。你会发现自己更容易更快。 /编辑

我会使用NoSQL(这就是我现在正在做的。以前我在大型项目中使用MySQL)。为什么?它的使用更加简单,因此您可以更加关注其他重要的事情(NoSQL解决了大多数数据存储问题):

  • 您不必定义模式,这也意味着您不必升级它。在MySQL中,由于系统升级,我有很长的停机时间。添加单列/索引花费了很多时间。表格只有几百万行

  • 您可以在几分钟内运行分布式环境。在MySQL中,您必须在几台机器之间手动分割数据(除非您将所有内容都放在一台机器上,这不是一个好主意)

  • 你会有更好的表现。MySQL的性能真的很差。没有memcached它就不能工作。Memcached是一个分布式键值存储(简单的NoSQL数据库)。显然,使用memcached会增加优化查询的时间

  • 您不必考虑规范化/非规范化

  • 查询很简单(至少在键值存储中)。您只是不关心这样的问题:我应该使用“where UserId=12345”还是“where UserId='12345'”(在MySQL中,其中一个不会使用索引!)

  • 如果一台使用NoSQL的机器出现故障,那么在您的应用程序中就不需要考虑这一点。查询将在另一个副本上执行(您不必实现这一点!)

使用NoSQL也有缺点

  • 你不会得到酸。在大多数情况下,你根本不需要那个

  • 还有更多熟悉SQL解决方案的开发人员。另一方面,NoSQL解决方案要简单得多(至少在我的经验中是这样),所以您不需要经过认证的数据库管理员(一个解决您的数据库问题的魔术师,只有他知道它为什么工作)

  • 您不能执行某些查询—例如,连接不存在,但是如果您不规范化数据,那么连接将毫无用处(并且您可以节省时间,因为您不必考虑规范化)

伟大的文章:


我的建议是从NoSQL开始并坚持下去。你应该看看基于dynamo的数据库,比如Riak和Cassandra。也可以尝试CouchDB(CoachBase)。这适用于大多数数据。对于朋友关系,图形数据库是一个不错的选择。

我使用MongoDB、Riak和其他一些No