Web应用程序数据库 - 最佳性能和可伸缩性



我目前正在构建每个客户都能创建多个项目的Web应用程序。对于每个项目,用户将上传数千行数据(1,000-50,000),我们称其为"帖子"。

最好创建一个单个项目数据库,其中每一行包含其项目ID,每个客户每行都包含其项目ID或每个项目数据库。

'BOTTER'定义为更好的性能和扩展能力。每个项目的所有帖子都将用于具有数千个功能(5,000-10,000)的机器学习算法中,并显示给用户以标记为正面或负面。我们尚未决定一个数据库。

如果我正确理解您的应用程序,您当前正在比较两个解决方案:

  1. 创建n个数据库,每个数据库包含1个表,包含1个项目的数据
  2. 创建1个数据库,包含1个表,包含n项目的数据(需要项目ID的额外列)

有第三种可能性,是

  1. 创建1个数据库,包含n个表,每个表包含1个项目

绩效(1)(3)之间的性能差异,如果您仅访问一个项目的数据,在任何给定时间,(在(1)的情况下,全部运行在同一服务器上。(3)如果您一次访问多个项目,往往更快,更容易。关于stackoverflow有大量信息比较其他两个选项(2) and (3),单台vs.与Mutiple-Table。在大多数情况下,性能差异很小,有良好的索引,但并非微不足道。

可伸缩性:您声明每个项目都按数千行的顺序。您不说可能有多少个项目。您也不声明需要要求或更改数据的频率。因此,以下所有IST只是一个指南:现代服务器可以轻松地处理一个数据库实例中的数百万行(以1k/行(仅为千兆字节)),并轻松每分钟提供数千个请求(如果设计正确的话)。当涉及数十亿或更多的行(多个数据)或每秒成千上万的请求时,他们开始挣扎。当您碰到隐喻墙时,这在很大程度上取决于数据库本身的设计,但是一旦您碰到一个大小,一个数据库实例无法以尺寸或速度原因进行处理,那么您就必须水平扩展任一。或垂直。通过多个数据库,水平缩放(即添加更多服务器)更容易且价格便宜。将您的项目分隔为不同的数据库可能会使此更容易,但是这样一个简单的解决方案很可能会在许多服务器上闲置,而其他服务器则在其他人运行热时会结束。大多数现代数据库系统允许即使在一个数据库中,也可以将单个数据库分开。

最后,您没有指定足够的时间来真正回答您的问题。从您的写作方式来看,我猜您目前还没有真正做出最终决定的能力 - 您只是想不让自己射入自己的脚上。因此,这是

的快速指南

如何不在脚上开枪

  • 将所有数据库访问代码从单个单元中分开。
  • 将所有程序逻辑保留在该代码之外
  • 保持该代码维护良好和记录
  • 让某人知道多个DBM的人查看您的查询,以确保他们容易便携

如果这样做,您将仅通过修改一个文件来更改数据库系统或更改数据的分区。您甚至可以通过交换该代码文件来基准不同的设计。

查看您的简短问题,您有三个实体: N User , (N * 1000) Project, (N * (N*1000) * 50000 )Posts

基于我的假设正在谈论机器学习内容和可咨询性,因此我可以安全地假设至少有10万用户。每个用户可以创建几个项目,例如1000。每个项目都可以有50,000个帖子。

100,000 Users * 1000 Project * 50,000 Posts.

RDBMS解决方案将是 Create User table(UserId, Name etc..), Create Project Table (ProjectId, etc..) Create Mapping table for UserProject (UserProjectId, UserId, ProjectId) Create Posts table (PostId, PostContent..., PostDate)

最后一个表确实取决于实际数据和读/写频率。如果您只想通过Little Insert操作阅读性能,那么在任何现代RDBMS中都可以实现多个选项:

  • 一个表UserPosts(userProjectId,postid)这将是巨大的表肯定会越过数十亿行,但可以处理它。
  • 您可以根据卷的不同范围为UserProjectID范围创建多个UserPosts表,然后在其顶部创建一个视图/功能,以决定基于UserProjectId的数据来选择哪个表。

最新更新