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

时间:2009-09-14 15:12:43

标签: database-design caching

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

如果您希望有许多客户端访问此数据库(使用许多不同的语言编写),您可能希望在客户端可以连接到的数据库之上编写一个瘦服务器层。该服务器可以处理缓存,也可以通过线路gzip发送的数据。然后您的客户端可以发送一条消息,询问自X时刻以来的最新数据,并且服务器可以返回所需的数据,或者返回“从时间X开始没​​有更改”的消息

答案 1 :(得分:0)

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

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


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

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


否则,您将自己执行同步。

您可以拥有一个专用的版本表,其中包含每个表的最新版本号,以及一列参考每个表的每行的数据版本。 要进行同步,您需要:

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

答案 2 :(得分:0)

根据您的描述,不太可能从3个或4个以上的站点访问数据库。这是数据库复制(even MySQL supports this)的设计目的。

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