Database design 数据库分片、非规范化和同步

Database design 数据库分片、非规范化和同步,database-design,sharding,denormalization,Database Design,Sharding,Denormalization,在切分中,建议采用不共享、切分所有内容的方法。从本质上讲,这意味着:要一起使用的数据要一起存储(即,在单个分片中)。这非常符合在应用程序级别拆分数据的理念 但完全去规范化数据并不总是可行的。例如,考虑电子商务网站。理想情况下,与用户对应的所有数据都应保存在一起。但是,一些数据,如产品可用性,需要在整个过程中同步。在某些情况下,如前面提到的,这种同步需要实时进行。例如,假设用户已将产品添加到其愿望列表中。原则上,关于愿望列表项目的所有数据应与用户的其他数据一起保存。但是,多个用户可以希望列出同一项

在切分中,建议采用不共享、切分所有内容的方法。从本质上讲,这意味着:要一起使用的数据要一起存储(即,在单个分片中)。这非常符合在应用程序级别拆分数据的理念

但完全去规范化数据并不总是可行的。例如,考虑电子商务网站。理想情况下,与用户对应的所有数据都应保存在一起。但是,一些数据,如产品可用性,需要在整个过程中同步。在某些情况下,如前面提到的,这种同步需要实时进行。例如,假设用户已将产品添加到其愿望列表中。原则上,关于愿望列表项目的所有数据应与用户的其他数据一起保存。但是,多个用户可以希望列出同一项目,其他用户也可以购买该项目,从而影响其可用性。因此,需要以某种方式共享和同步信息

多个连接所带来的复杂性和性能损失也是众所周知的

为了使问题更加棘手,可以预期,在上述示例中,或在任何需要适当ACID事务的情况下,同步必须是实际实时的。如果喜欢的数量被延迟更新是可以接受的,但是对于一个电子商务站点来说,显示延迟的产品可用性数据是不好的

在这种情况下,最好的方法是什么

一个初步的想法是对可用性、事务状态等领域使用推送/通知机制。但我真的很想听听专家们的意见。显然,我已经在上读到易趣的体系结构,但它没有涉及到这一级别的实现细节

有一个相关的讨论,但它有更多的问题,而不是答案

编辑/更新:
正在考虑的数据库是Postgres。

您还没有指定要查看的任何数据库,因此我将介绍一些真正高端的lattice框架如何在PostgreSQL上解决这一问题。如果没有其他问题,这将为你的答案提供一个起点

在本讨论中,晶格框架本质上是一个具有一系列协调碎片的框架,这些碎片看起来像单个数据库。可以说存在一些差异,特别是在工具方面,但它们遇到的问题与您所问的完全相同。晶格通过两阶段提交(two-phase commit)之类的方式管理存储节点,从而允许协调器有效地实施跨碎片引用完整性。Pg世界中最常用的框架是Postgres XL

使用Postgres XL(以前称为StormDB),您可以在协调器节点和存储节点之间进行划分。每个存储节点实际上都是一个碎片。协调器节点管理对存储节点的访问,并将整个存储节点集表示为单个一致的数据库

有两点:

  • 在这类fraamework中,由于连接性能和引用完整性实施等多种原因,交叉切分外键的成本很高。所以好的设计避免了这些
  • 交叉碎片外键的解决方案涉及重大的权衡
  • 在这种情况下,您可以选择只接受跨节点性能影响,或者同步数据。如果执行后一种操作,写入速度将永远不会超过最慢的节点,因此您不希望对频繁写入的数据执行此操作

    这意味着您必须确定哪些数据经常被写入,哪些数据最稳定。稳定的数据可以同步。不应删除易失性数据

    因此,在电子商务解决方案中,如果您的零件目录相当稳定,您将同步该目录,然后共享客户和订单。但是,部件的现场现有数据不会在主机之间复制,而是单独进行分片/分区,以便对这些数据的更新也可以进行写扩展。因此,有时您必须考虑将现有表分解为稳定和不稳定的部分