use*_*429 4 postgresql database-design application-design cassandra design-pattern
我正在尝试编写我的第一个大型后端项目。这是一个类似于 Instagram 的移动/网络应用程序,但用途不同。当我在互联网上搜索时,我发现 Instagram 使用 PostgreSQL 和 Cassandra 作为它的主要数据库。但我不知道它使用哪个数据库的目的/类型/部分数据?
有谁了解更多有关 Instagram 使用的数据库的信息,或者一般情况下,我可以知道如何决定哪些服务或哪种类型的数据/应用程序最好使用 SQL 或 NoSQL 数据库吗?
我是否可以知道如何决定哪些服务或哪些类型的数据/应用程序最好使用 SQL 或 NoSQL 数据库?
如果满足以下任意组合,则使用 SQL 数据库:
否则请使用 NoSQL 数据库。特别是如果您的架构定义不明确并且更改频率超出您愿意管理的范围。
除此之外,用例没有太大差异。NoSQL 在某种程度上是 SQL 的子集,但它们也以不同的方式相互补充。
水平缩放怎么样?我读到,RDBMS 数据库在大型、快速增长的项目的水平扩展方面存在重大问题。
在我看来,水平扩展又名分片有点花哨。如今,服务器垂直扩展的空间很大,尤其是虚拟化和/或云服务。
当想到水平扩展/分片主题时,MongoDB 是最主流的 NoSQL 数据库之一。许多缺乏经验的人喜欢感叹分片如何使扩展变得更容易、更便宜,或者两者兼而有之。但即使是 MongoDB 的开发人员也持相反的观点,称分片存在问题、难以管理、限制了可以运行的查询,甚至声称垂直扩展更实用且更具成本效益(神话#5):
分片集群还使您的数据更难以管理,并且它们对您可以执行的查询类型增加了一些限制。如果您需要的话,分片很有用,但简单地升级硬件通常更便宜、更容易!
事实上,同一篇文章讨论了如何使用至少8 台服务器来正确设置 MongoDB 分片。与为特定硬件垂直扩展基础设施相比,为 8 台服务器中的每台服务器支付完整系统中所有硬件的冗余成本肯定会更高。当然也有例外情况,但一般来说,我很难看到它对于普通用户来说具有成本效益。
但即使是现代 SQL 数据库也支持水平扩展的各种实现,如果有人觉得需要利用这种方法的话。例如,SQL Server有一个称为可用性组的功能,它可以自动将数据从一台服务器同步到同一组中的其他副本服务器。它甚至提供两种同步模式,具体取决于您是否优先考虑服务器之间的性能而不是数据一致性(类似于分片拓扑中 NoSQL 数据库同步通常看到的最终一致性的概念,但不完全相同)。
除此之外,当数据库经过优化架构并具有高效设计的查询时,SQL 数据库可以处理大量数据的高并发性。SQL Server 能够处理包含数万亿条记录的表。我个人曾在事务性相当大(每分钟 1,000 个事务)、硬件极少(16 GB 内存、8 个 CPU 核心等)的服务器上处理过数十亿个表,并且大多数查询都在低于1秒。
这背后的一些关键思想是,静态数据可以是任意大小,从性能角度来看(对于大多数用例),这并不重要。使用 B 树数据结构的正确索引可以对任何可实现的数据大小进行最佳搜索(即使按照 100 年后的大数据标准)。这是因为 B 树具有O(log(n))搜索时间复杂度。这意味着如果您的表有 10 亿行,在最坏的情况下,需要log2(1 billion) = 30找到数据的任何子集。如果该表增长到 1 万亿行,log2(1 trillion) = 40则查找任何子集。对于任何现代计算机来说,即使使用手机硬件,搜索 B 树的 30 和 40 个节点也需要几毫秒。
长话短说,从性能角度来看,任何现代 SQL 数据库与现代 NoSQL 数据库的功能没有任何区别。大多数数据规模问题通常最好在软件方面解决,而不是硬件方面,因为大多数性能问题是由不良的数据库设计/实现和/或编写不良的代码(查询)引起的。
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |