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

时间:2017-03-04 22:34:16

标签: database database-design architecture scalability

我目前正致力于构建一个Web应用程序,每个客户都可以创建多个项目。对于每个项目,用户将上传数千行数据(1,000-50,000),我们称之为“帖子”。

创建单个项目数据库是否更好,其中每行包含其项目ID,为每个客户创建一个数据库,其中每行包含其项目ID或每个项目的数据库。

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

2 个答案:

答案 0 :(得分:1)

如果我理解您的申请是正确的,那么您目前正在比较两种解决方案:

  1. 创建N个数据库,每个数据库包含1个表,包含1个 项目数据
  2. 创建1个包含1个表的数据库 N个项目的数据(需要项目ID的额外列)
  3. 还有第三种可能性,即

    1. 创建1个数据库,包含N个表,每个表包含1个项目
    2. 效果:如果您只访问一个项目的数据,(1)(3)之间的效果差异往往微不足道在任何给定的时间,(并且在(1)的情况下都在同一台服务器上运行)。如果您一次访问多个项目,(3)往往更快更容易。 StackOverflow上的There is a ton信息比较其他两个选项(2)(3) ,单表与多表。大多数情况下,性能差异较小,有良好的索引,但并非无关紧要。

      可伸缩性:您声明每个项目都有数千行。您没有说明可能有多少个项目。您也没有说明需要请求或更改数据的频率。因此,以下所有内容仅仅是一个指导原则:现代服务器可以在单个数据库实例中轻松处理数百万行(1k /行,只有千兆字节),并且每分钟可轻松处理数千个请求(如果设计得当)。当谈到数十亿行或更多行(多TB数据)或multiple thousands of requests per second时,他们开始挣扎。当你完全碰到隐喻墙时,它很大程度上依赖于数据库本身的设计,但是一旦你达到一个数据库实例因尺寸或速度原因无法处理它的大小,你将不得不扩展{ {3}}。对于多个数据库,水平扩展(即添加更多服务器)更容易且更便宜。将您的项目分成不同的数据库可能会使这更容易,但这样一个简单的解决方案很可能会结束在许多服务器闲置,而其他服务器正在运行热。大多数现代数据库系统允许单个数据库在多个计算机上分割,即使在一个数据库中也是如此。

      最后,您没有指定足以真正回答您的问题。从你写它的方式来看,我猜你现在还没有真正做出最后决定的位置 - 你只是试着不要自己开枪。这是

      的快速指南

      如何不在脚下射击

      • 将所有数据库访问代码分成单个代码单元。
      • 将所有程序逻辑保留在该代码之外
      • 保持这段代码的良好维护和记录
      • 让具有多个DBMS知识的人查看您的查询以确保它们易于携带

      如果这样做,您将能够稍后通过仅修改该文件来更改数据库系统或更改数据分区。您甚至可以通过交换单个代码文件来对不同的设计进行基准测试。

答案 1 :(得分:0)

查看您的简短问题,您有三个实体: <nav id="nav"> <span class="close" onclick="closeNav()">&times;</span> <p>Home</p> <p>About</p> <p>Blog</p> <p>Contact</p> </nav> <span class="burger" id="burger" onclick="openNav()">&#9776;</span>

基于我所说的机器学习和可扩展性的假设,所以我可以安全地假设至少有100,000个用户。 每个用户可以创建几个项目,比方说1000。 每个项目可以有50,000个帖子。

N User , (N * 1000) Project, (N * (N*1000) * 50000 )Posts

RDBMS解决方案将是 100,000 Users * 1000 Project * 50,000 Posts.

最后一张表真的取决于实际数据和读/写频率。如果你只是想要一点点插入操作的读取性能,它可以在任何现代RDBMS中实现,多种选择:

  • 一个表UserPosts(UserProjectId,PostId)这将是巨大的表肯定会跨越数十亿行,但它可以处理它。
  • 您可以根据卷创建UserProjectId范围的多个UserPosts表,然后在其上创建一个视图/函数,以根据UserProjectId决定选择哪个表数据。