规划数据库扩展和架构更改

Planning for database scaling and schema changes

我在创建社交网络数据库之前进行了研究,我发现了很多 questions/resources 关于社交网络的图形和键值数据库。我知道有很多不同的选项和方法来实现数据库。我也明白大公司做的事情很复杂,远远超出我目前需要的(1b+ 用户)。我也知道每家大公司都改进了他们的数据库,以应对他们经历的疯狂扩展。

因为我不知道网络将如何发展,而且我不相信我可以准确地创建一个可以扩展到 100 万用户的模型(由于未知因素,例如人们将如何使用它,人们多久使用一次post、评论等)。但我至少可以尝试创建一个在(如果)需要时最容易扩展的数据库。

大多数公司是否创建一个数据库来处理多达 1000 名用户,然后一旦他们增长,他们就会为 10k 用户改造它,然后是 100k,等等?如果他们这样做了,对于这些任意数字中的每一个(由于上面列出的未知数),公司通常会更改一些 tables/nodes/etc,还是他们会完全重新创建数据库以利用新技术(例如从 SQL 到图表)?

我想选择最佳解决方案,但我发现在图形、键值、SQL 之间做出决定非常困难——尤其是在没有数据的情况下 [=22= 】 最重要。我相信我可以使用可支持多达 10k 用户的图形创建一个可靠的系统,但我担心随着系统的增长可能不得不完全重新创建数据库。这是现在避免问题的担忧,还是现在实施并适应以后类型的问题?

更进一步,如果我确实需要计划完整的数据库重组,使用多模型 NoSQL DBMS(例如 OrientDB 或 ArangoDB)通常有意义吗?

我个人认为您提的问题过早。

说真的,即使模型不好,一个数据库也可以处理 10k 个用户。

您考虑缩放,但最难的问题不是缩放,而是到达需要缩放的地步 .

我敢肯定每个人都想要 10 亿用户,但您已经梦想拥有一个用户数量是 Github 本身 200 倍的社交网络? (Github 拥有约 500 万用户)。

此外,即使提前考虑,您肯定会在数年内重构和重构,并且您将拥有不止一个持久层,请确保。

代码和代码良好,保持精简,保持快速更改、部署、向用户展示、重构、测试、部署并在同一天向用户展示。这些是您现在需要做的事情,而不是询问您还没有遇到的问题,您现在肯定还有很多其他问题需要解决 ;-)

更新

根据您的评论,您可能需要考虑我们无法简单回答的问题,因为我们不需要您的确切要求。

我有一个简单的应用,它使用了4个持久层,这个应用还没有上线。我会给你我的"why"关于使用它和哪个用例:

  1. Neo4j : 它是应用程序数据的核心,我使用它是因为我喜欢它,我非常了解它(这是我的工作)并且因为应用程序的概念非常新的并且可以快速发展,拥有一个无模式的数据库正在减少很多重构的东西。此外,我现在通过构建应用程序获得了很多用例,这使得 Neo4j 在您需要添加功能而不破坏已经完成的工作时成为一个不错的选择。

  2. MySQL

我将其用于用户帐户和配置文件。为什么 ?因为我使用的框架已经有很多 bundle,在几行代码中集成了这种东西,bundle 得到了很好的维护,如果我要使用(当前)neo4j,我将不得不重新发明轮子。此外,我使用的所有模块都在稳定性和与框架的兼容性方面不断发展。

当然 mysql 数据与 neo4j 数据耦合(最低限度)。但我知道这种数据不会进化那么多,所以 Mysql 是一个不错的选择,万一我必须重构一些点,这不会是一个巨大的痛苦。

  1. Redis

我使用 Redis 存储分析数据,Redis 非常灵活,我可以轻松创建新键并在其上添加数据。

  1. RabbitMQ:

我使用了很多消息队列,为什么?用于测试重构。我可以轻松地处理多个消费者的消息,以测试 "refactoring"、测试多个数据库层,而应用 运行 用于测试更改、测试新功能、测试重构……

你会重构!尽量保持简单。