Database design 如何设计缓存友好的数据库表?

Database design 如何设计缓存友好的数据库表?,database-design,caching,Database Design,Caching,我想设计一个通过非常慢的网络链接访问的数据库。幸运的是,数据库本身是相当静态的。所以我将使用积极的结果缓存。在客户端运行时,有时可能会在表上发生其他插入和更新,因此我想设计一个低带宽系统,在该系统中,客户端可以准确地知道什么时候更新了某些内容,从而避免检查远程数据库 我的想法是创建一个包含两列的特殊表,一列是表名,另一列是版本号。应用程序查询永远不会直接修改此表。它将使用存储过程进行更新。每当修改任何表时,存储过程都应该增加这个特殊表的数量 然后,客户机可以将查询结果与表的版本号一起存储在本地数

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

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

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

这听起来怎么样?是否有其他策略来最小化冗余数据库带宽和主动缓存数据库?这不仅是跨平台的,而且不同的编程语言的客户端将访问它(C、C++、Obj-C、Python等),因此我在所有情况下都试图找到最简单的工作。
理想情况下,我希望将表设计为增量表(删除是实际插入),这样我就可以查询表的最高ID并与本地ID进行比较。然而,我不知道在哪里可以找到这样的例子。阅读让我头晕目眩。

我想它一开始可以奏效。您还可以对表中的数据进行分组,以便经常更改的数据与接近常量的数据不在同一个表中

但是数据库也用于运行复杂的查询,其中包含许多连接。您将失去所有服务器代码的可能性,这将是一个巨大的成本!或者你可以实现那个检查,但它会非常复杂,而且可能会以某种方式变慢


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

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


否则,您将执行自己的同步实现

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

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

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

根据您的描述,从3个或4个以上的站点访问数据库似乎不太可能。数据库复制()就是针对这种情况设计的


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

我认为只有在批处理大量更新时,时间戳才能很好地工作。或者,当您来回寻找时间戳时,您可能已经完成了+1如果此服务器模块有通用语言,回答很好。但是为了使缓存有效,缓存需要位于服务器本身,因此远程通信是与数据库的。压缩是否可以发生在该通信上?服务器层将与数据库运行在同一个本地网络上。然后,它将压缩数据,然后再通过慢速网络链接发送到客户端。服务器模块可以用任何语言编写,因为它将通过某种网络协议与客户机通信,如tcp/ip之类的中级协议,或http或XML-RPC之类的高级协议