【问题标题】:How to design database tables that are cache friendly?如何设计缓存友好的数据库表?
【发布时间】:2009-09-14 15:12:43
【问题描述】:

我想设计一个通过非常慢的网络链接访问的数据库。幸运的是,数据库本身是相当静态的。所以我将使用积极的结果缓存。有时,在客户端运行时,表上可能会发生其他插入和更新,因此我想设计一个低带宽系统,客户端可以准确地知道何时更新了某些内容,以避免甚至打扰检查远程数据库。

我的想法是创建一个包含两列的特殊表,一列是表的名称,另一列是版本号。该表永远不会被应用程序查询直接修改。它将使用存储过程进行更新。每当修改任何表时,存储过程都应增加此特殊表的编号。

然后,客户端可以将查询结果与表的版本号一起存储在本地数据库(比如 sqlite)中。然后,下次在特殊表上运行 select 并检查表是否已更改。

这听起来怎么样?是否有其他策略来最小化冗余数据库带宽并积极缓存数据库?事情将不仅是跨平台的,而且编程语言中的不同客户端将访问它(C、C++、Obj-C、Python 等),所以我试图找到最简单的东西在所有情况下都可以工作。

理想情况下,我想将表设计为增量(删除是实际插入),因此我可以只查询表的最高 ID 并与本地 ID 进行比较。但是,我不知道在哪里可以找到这样的例子。阅读CouchDB's technical page 让我头疼。

【问题讨论】:

  • 我认为时间戳只有在批量更新时才能正常工作。或者,当您往返于时间戳时,您可能已经完成了!

标签: database-design caching


【解决方案1】:

如果您希望有大量客户端访问此数据库,并且使用多种不同的语言编写,那么您可能希望在数据库之上编写一个瘦服务器层,以便您的客户端可以连接到该数据库。该服务器可以处理缓存,并且可以压缩它通过网络发送的数据。然后您的客户端可以发送一条消息,询问自时间 X 以来的最新数据,而服务器可以只返回所需的数据,或者一条消息说“自 X 时间以来没有变化”

【讨论】:

  • +1 好答案,如果此服务器模块有通用语言。但是要使缓存有效,缓存需要在服务器本身上,因此远程通信是与数据库进行的。可以在该通信中进行压缩吗?
  • 服务器层将在与数据库相同的本地网络上运行。然后它将压缩数据,然后通过慢速网络链接将其发送到客户端。服务器模块可以用任何语言编写,因为它会通过某种网络协议与客户端通信,可以是 tcp/ip 之类的中级协议,也可以是 http 或 XML-RPC 之类的高级层
【解决方案2】:

我认为它起初可以工作。您还可以对表格中的数据进行分组,以便您经常更改的数据与您的近乎恒定的数据不在同一个表格中...

数据库也用于运行复杂的查询,有许多连接。您将失去所有服务器代码的这种可能性,这将是一笔沉重的成本!或者您可以实现该检查,但它会非常复杂,而且可能会有点慢......


如果您保留数据库的本地副本,与远程数据库同步,会不会更容易。您仍然可以在本地使用复杂的查询。

并且数据库之间的同步可能已经与您的数据库供应商存在。 至少,现在这是一个普遍的问题,因此您可以寻找现有的良好解决方案:-)


否则,您将自己实现同步。

您可以有一个专用的版本表,其中包含每个表的最后一个版本号,以及一个引用每个表的每一行的数据版本的列。 要同步,您可以:

  • 查询远程版本表,将其与本地版本表进行比较,并确定要查询的表以及每个表感兴趣的版本范围。
  • 对于每个要查询的表,查询获取版本号在合适范围内的所有行,并在本地数据库中插入或更新行。

【讨论】:

    【解决方案3】:

    根据您的描述,数据库似乎不太可能被超过 3 或 4 个站点访问。数据库复制 (even MySQL supports this) 就是为这种情况而设计的。

    您可以在需要访问数据库的每个站点中都有一个复制从站。并编写您的客户端软件来简单地查询本地副本。相信我,当您不必重新实现复制等低级功能时,数据库会更容易使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多