代码之家  ›  专栏  ›  技术社区  ›  Grzegorz Adam Hankiewicz

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

  •  3
  • Grzegorz Adam Hankiewicz  · 技术社区  · 15 年前

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

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

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

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

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

    3 回复  |  直到 15 年前
        1
  •  1
  •   Peter Recore    15 年前

    如果您希望有许多客户机访问这个数据库,用许多不同的语言编写,那么您可能希望在客户机可以连接的数据库之上编写一个瘦服务器层。这个服务器可以处理缓存,也可以gzip它通过线路发送的数据。然后,您的客户机就可以发送一条消息,询问自时间x以来的最新数据,服务器可以只返回所需的数据,或者返回一条消息,表示“自时间x以来没有任何更改”。

        2
  •  0
  •   KLE rslite    15 年前

    我想一开始可以用。您还可以对表中的数据进行分组,这样频繁更改的数据就不会与接近常量的数据位于同一个表中…

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


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

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


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

    你可以有一个专门的 版本表,每个表的最后一个版本号,以及一列,引用每个表的每一行的数据版本。 . 要同步,您将:

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

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

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