【问题标题】:5 separate database or 5 tables in 1 database?5 个单独的数据库或 1 个数据库中的 5 个表?
【发布时间】:2010-12-04 08:11:17
【问题描述】:

假设我想建立一个游戏网站,并且我有很多游戏版块。他们都有很多需要存储的数据。是用一个代表每个游戏的表格创建一个数据库,还是让一个数据库代表游戏的每个部分更好?我非常期待一个“取决于”类型的答案。

【问题讨论】:

  • 很难说没有更多关于你想要/试图存储的信息。
  • 您应该设计您的系统,使其能够正常工作,衡量性能,然后在需要时进行优化
  • 你的问题有点含糊:是一个游戏有多个部分还是五个不同的游戏?
  • 让我们说这是同一家公司旗下的 5 款独立游戏。

标签: mysql database-design data-modeling


【解决方案1】:

管理 5 个不同的数据库将是一件令人头疼的事情。我建议使用一个包含 5 个不同表的数据库。除了其他任何事情,我不会惊讶地发现你在 5 之间有一些共同的信息 - 例如。用户身份。

请注意,您对“大量数据”的想法可能与数据库的想法不同...数据库通常是为处理 巨大 块数据而编写的。

【讨论】:

  • 可能甚至不需要 5 个表,这真的取决于架构。
  • 独立的数据库意味着它们更容易备份/恢复;单个数据库意味着所有组件都在工作或没有。在任何一种情况下,数据模型更改的影响都是不可避免的,但如果数据库是独立的,则可以零碎实施。
  • 这真的取决于组件是否相互依赖。如果他们不这样做,那么@rexem 的评论是有道理的。如果它们是相关的,那么将它们保存在一个数据库中会更有意义。此外,如果您的数据太大以至于您需要考虑分片或分区,那么这将是您最关心的问题。
  • @rexem:在某些情况下,跨 5 个数据库实施更改确实可以让您在较小的块中进行更改 - 但这也意味着总共可能有更多工作要做,从而产生更大的可能错误。我也不确定为什么您认为备份 5 个单独的数据库比备份 1 个更容易。我想这意味着您可以使用 5 个较小的存储区域……但我怀疑这有什么大不了的。 5 个时间表、5 组脚本等对我来说听起来是个坏主意。
  • @Jon:时间表只是时间表 - 有很多大型场所使用这种方法,做得很好。我的实际观点是,使用单个数据库可以将其限制为单一应用程序。如果数据库被拆分,恢复子组件会更容易。
【解决方案2】:

视情况而定。

开个玩笑。如果这是一个项目,并且数据以任何方式相互关联,我总是会选择一个数据库,而没有具体且令人信服的理由。为什么?因为我不记得自己曾想过“男孩,我真希望看到这些信息更难。”

【讨论】:

    【解决方案3】:

    虽然您的问题中没有足够的信息来给出一个好的答案,但我想说的是,除非您预见到同一用户(或查询)需要同时来自两个游戏的数据,否则没有理由合并数据库.

    您可能应该为任何常见的事物创建一个数据库,然后为任何独特的事物创建独立的数据库。数据库,就像代码一样,最终往往会针对不同的应用程序朝着不同的方向发展。将它们放在一起可能会导致您破坏事物或在更改时更加保守。

    此外,一些数据库在数据库级别而不是表级别进行优化、管理和备份。由于它们可能具有不同的性能特征和使用配置文件,因此一刀切的解决方案可能无法扩展。

    如果您使用 ORM 框架,您可以(几乎)免费访问多个数据库,同时仍然避免代码复制。因此,除非您有联合查询,否则我认为为共享数据库付出风险是不值得的。

    当然,如果您花钱请人托管您的数据库,使用单个数据库可能会更便宜,但这确实是一个业务问题,而不是软件问题。

    如果您确实选择使用单个数据库,请帮自己一个忙,并确保每个游戏的代码只知道特定的表。这将使您更容易在以后维护事物或将其分离到多个数据库中。

    【讨论】:

      【解决方案4】:

      一个数据库。

      您合理地想要存储的大部分内容将是文本或原始数据类型,例如整数。您可能喜欢将二进制内容放入 blob 中,但在网络服务器将通过 HTTP 免费提供文件的媒体密集型网站上,这是一个疯狂的计划。

      我在一家大型游戏发行商的网站上担任首席编程职责。我们设法以三种欧洲语言覆盖了他们当前和以前的大部分内容。

      我们从未考虑过使用多个数据库来存储所有这些内容,尽管事实上每个标题都充满了视频和图像资源。

      我无法想象为什么多数据库配置会满足您的需求,无论是在开发中还是在它之外。您必须拉动的同步量和错误容量是巨大的。试图从所有这些中提取与所有这些相关的数据将是一场噩梦。

      您迁移的每个站点范围的更新都将是 n 倍,并且容易出错,其中 n 是您最终需要的数据库数量。

      说真的,一个数据库 - 这与您预期的取决于答案相差甚远。

      【讨论】:

        【解决方案5】:

        如果不同的游戏不共享任何数据,则使用单独的数据库是有意义的。另一方面,如果游戏数据的结构相同,则使用一个数据库是有意义的——否则您将不得不分别在每个游戏数据库中进行更改。

        更新:如有疑问,您应该始终使用一个数据库,因为在大多数情况下更易于管理。只要您确定应用程序是完全独立的并且具有完全不同的结构,您就应该使用更多的数据库。唯一真正的优势是更清晰。

        【讨论】:

          【解决方案6】:

          一般来说,“每个应用程序一个数据库”往往是一个很好的经验法则。

          如果您正在构建一个网站,其中包含许多用于讨论不同游戏(或不同类型游戏)的部分,那么这是一个单一的应用程序,因此一个数据库可能是可行的方法。我不是很肯定,但我认为这可能就是您要问的情况。

          另一方面,如果您的“一个站点”是针对五款不同游戏集合的战网类型匹配服务,那么该站点本身就是一个应用程序,而这五个游戏中的每一个都是一个单独的应用程序,所以您可能需要六个数据库,因为您总共有六个基本独立的应用程序。不过,我的印象是,这不是您要问的情况。

          【讨论】:

            【解决方案7】:

            如果您要为每个游戏存储相同的数据,那么使用 1 个数据库来存储所有信息是有意义的。跨不同数据库复制表结构是没有意义的,同样,如果它们都存储相同的信息,那么为 5 个游戏创建 5 个表也没有任何意义。

            【讨论】:

            • @James Goodwin 实际上,在独立数据库中复制数据结构是一种非常有效的可扩展性模式。这称为分片,有时也称为水平分区。
            • 我确信在一些大型数据库中这是必要的,但在这种情况下它可能会带来不必要的复杂性。
            【解决方案8】:

            我不确定这是否正确,但我认为您希望创建一个包含 5 个表的数据库,因为(以及其他原因)替代方案对连接池的影响(例如,如果您使用 ADO.网)。在 ADO.Net 连接池中,连接由连接字符串作为键,因此对于五个不同的数据库,您最终可能会得到每个数据库的 20 个连接而不是一个数据库的 100 个连接,这可能会影响连接分配的灵活性.

            如果有人更了解或有更多信息,请在此处添加,因为我不确定我所说的是否准确。

            【讨论】:

              【解决方案9】:

              您对“大量数据”有何看法?您需要将其拆分到多个数据库的唯一原因是,如果您想通过共享主机节省一些钱(即获得便宜的共享主机并将其拆分到服务器上),或者您认为每个数据库将在 500GB 以上范围,并且无法访问适当的存储空间。

              请注意,这两个原因都与架构无关,完全基于扩展过程中的金钱问题。

              但由于您还没有创建网站,所以您是本末倒置。一个全新的站点不太可能使用接近此存储级别的任何位置,因此只需创建 1 个数据库。

              一些公司的单个数据库在 1,000+ TB 范围内......数据库大小基本上没有上限。

              【讨论】:

                【解决方案10】:

                您要创建的数据库数量不取决于您的游戏数量,而是取决于存储在数据库中的数据,或者更好地说,取决于您如何在数据库之间交换这些数据。

                • 如果是导出和导入,那就做单独的数据库。
                • 如果是正常关系(外键和交叉查询),则将其保留在一个数据库中。

                如果数据库彼此不相关,那么它们当然是独立的数据库。

                在我的一个项目中,我区分了内部外部数据(它们存储在不同的数据库中)。

                区别很简单:

                • 外部数据库仅存储您无法更改或撤消的事实。在我们的案例中,这就是电话、SMS 消息和收款。

                • 内部数据库存储了通常存储的东西:用户、密码等。

                外部数据库仅使用自然的PRIMARY KEY,即电话号码、银行交易id等。

                数据库被赋予了完全不同的权限,它们之间的数据交换是导入和导出的问题,而不是关系。

                这确保了实际数据不会发生任何事情:将付款重新链接到用户很容易,但如果付款丢失则很难恢复。

                【讨论】:

                  【解决方案11】:

                  我可以分享我遇到类似情况的经验。

                  我们有 4 个“通用”数据库和大约 30 个“特定”数据库,它们因相同的空间问题而分开。缺点是空间问题只是将 dBase 的缺点投射到 SQL Server 上。我们最终在 SQL Server Enterprise 上使用了远远低于桌面版允许的最大大小的所有这些数据库。

                  从关于关注点分离的数据库的角度来看,4 个通用数据库可能是 2 个。30 个特定数据库可能是 3 个(或者甚至 1 个具有足够的操作/泛化能力)。决定大量数据库的是低效的代码(存储过程和数据访问层代码)和表模式;最终它与空间无关。

                  我会尽可能早地进行整合,并保持您的设计和实现足够灵活,以便在必要时提取组件。简而言之,计划多个数据库,但作为一个实施。

                  【讨论】:

                    【解决方案12】:

                    记住,尤其是在网站上。如果您有多个数据库,您通常会失去查询缓存和连接池的性能优势。坚持一个。

                    【讨论】:

                      【解决方案13】:

                      绝对是一个数据库

                      【讨论】:

                        【解决方案14】:

                        我工作的一个地方有很多数据库,一个用于所有客户使用的东西的通用数据库,一个用于客户定制的客户特定数据库。最终发生的事情是,由于客户要求进行更改,他们最终会出现在客户数据库中而不是普通数据库中,因此将有 27 种方法可以做本质上相同的事情,因为没有从特定于客户的重构到“嘿这个是其他客户也需要做的事情”,所以让我们把它放在一起。因此,一个数据库往往会减少重新发明轮子。

                        【讨论】:

                          【解决方案15】:

                          安全模型 如果每个游戏都有一组特定于该游戏的不同权限/角色,请将其拆分。

                          查询性能/复杂性
                          如果您需要频繁查询游戏之间的数据,我建议将它们保存在单个数据库中。

                          可扩展性 另一个考虑因素是您的可扩展性计划。如果游戏非常受欢迎,您可能需要为每个游戏购买单独的数据库硬件。从一开始就将它们分离到不同的数据库中会更容易。

                          数据大小
                          数据的大小不应成为此决定的一个因素。

                          【讨论】:

                            【解决方案16】:

                            只是补充一点。当您在一款游戏中拥有数百万玩家并且您的游戏是实时的并且您有数万名同时在线的玩家并且您必须至少在数据库中保持一些基本数据尽可能最新(例如,玩家的虚拟钱)。然后,即使它们都是“连接的”,您也会希望将表分成独立的 DB。

                            这真的取决于。无论您尝试做些什么来避免它变得痛苦,缩放都会很痛苦。但是,如果您真的希望有很多玩家、更新和数据,我建议您在确定“一个数据库用于多个项目”解决方案之前三思而后行。

                            是的,可能很难管理多个数据库。但无论如何你都必须这样做。

                            【讨论】:

                              【解决方案17】:

                              真的取决于:)..

                              问自己这些问题:

                              是否有我可能想要考虑的可重用性(用户表)? 是否值得将这些实体分开,或者它们几乎相同? 这些实体中是否有任何共享特定事件/需求? 构建 5 个不同的数据库系统是否值得我花费时间和精力(请记住,如果您正在编写的游戏意味着不同的连接字符串并提供更高的安全性等)。

                              或者您可以创建一个数据库 OnlineGames 并拥有一个存储游戏名称和类别的表:

                              吃豆人街机

                              塞尔达角色扮演

                              等等等等。

                              这真的取决于你的意图......

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2017-10-03
                                • 2010-10-30
                                • 2013-12-16
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多