为什么我要使用非关系型数据库?

9
最近数据库中最流行的趋势似乎集中在非关系型数据库上。为什么呢?这似乎有点违背生产力的原则。例如,对我来说,用关系方式表达数据(使用Django + SQL代码示例)更加合理:
class Post(models.Model):
    name = models.CharField()
    created = models.DateTimeField(auto_now_create = True)

class Comment(models.Model):
    text = models.TextField()
    post = models.ForeignKey('Post')
    created = models.DateTimeField(auto_now_create = True)

SQL:

create table post (id int primary key auto_increment,
        name varchar,
        created datetime);

create table comment(id int primary key auto_increment,
        text text,
        post_id int,
        created datetime,
        foreign key post_id references post(id));

SQL 的威力在于可以用很多种方式表达信息。当然,整个对象关系映射问题确实存在,但我认为这是一种特性而不是问题。使用 SQL,我可以获取给定帖子中所有比昨天旧的不同评论,将它们汇总在一起并生成统计数据。非关系型数据库能否做到相同的事情呢?
使用像 MongoDB 这样的非关系型数据库似乎会严重影响性能,因为你会立即获取整个对象图,而不是最少需要的部分。
有人能向我解释一下使用非关系型数据库的好处吗?

https://dev59.com/wXRC5IYBdhLWcg3wAcM3 - user172783
2个回答

4

看一下 CAP定理

以及 PACELC解释

关系型数据库往往会做一组权衡,而非关系型数据库则往往会做另一组权衡。对于大规模分布式数据集,非关系型数据库有时更加合适。

非关系型数据库还可以消除很多ORM痛苦,但是总是需要做出权衡。在某些用例中,非关系型存储可能更快,因为特定层次结构的所有数据可以更接近地存储在磁盘上。还要注意,非关系型数据库仍然具有查询功能。

最终,这取决于为您特定的用例做出适当的权衡。


你能否详细解释一下“特定层次结构的所有数据可以更接近地存储在磁盘上”? - wwwwan
@wwwwan - “将数据层次结构在磁盘上存储得更加紧密”很少是那么重要的。SSD 存储使其变得更不相关。关系型和非关系型数据库都采用缓存等技术。关系型存储通常需要从多个表中检索数据(通常存储在不同的磁盘页上),而非关系型存储 可能(非常依赖于实现)将特定层次结构的所有数据放在单个/较少的磁盘页上,因为它倾向于将层次结构视为单个“文档”。这可能会在资源严重受限的系统中产生差异。 - Nathan
虽然SSD消除了局部性优势,但在分布式系统中,局部性仍然扮演着非常重要的角色(在更高的尺度上)。 - Vicente Bolea

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接