2011-03-29 67 views
4

假设有一个桌面应用程序 - 可以最好地描述为用户插入/查看记录的记录 - 依赖于DB后端,该后端将包含对象的层次结构和属性。如何处理数据检索?带数据库的桌面应用程序 - 如何处理数据检索?

如果所有的数据是在启动时加载并存储在以后的操作还是应该将数据只需要检索相应的类/结构,存储在模拟式类/结构,再后来重用而不是再次被要求到数据库?

就我所见,前一种方法需要使用更大的存储器部分,并且可能在启动时等待时间(如果显示启动画面,则不会太差),而后者可能会使用户延迟在处理期间由于数据检索而需要在数据库上执行一些昂贵的查询,其结果和/或支持数据结构一旦被使用就很可能无用*。

有些东西告诉我,解决方案在于深入分析,这将导致上面列出的两种方法基于最常用的数据的混合,但我非常有兴趣阅读您的想法,技巧和现实生活关于这个话题的经验。

为了讨论的缘故,我正在考虑C++和SQLite。

谢谢!

* 假设您可以对类/对象执行更快的操作,而不必对数据库执行复杂的查询。

编辑

一些额外的细节:

  • 没有并发访问数据,这意味着只有1个用户工作在其本地存储的数据。
  • 根据所做的更改发回数据人为地 - 即低频率。这对于从数据库读取数据来说并不一定是正确的,在那里我可以预计有几个高峰期的大量读取,我希望快速。
  • 我最害怕的是用户在显示一个复杂的记录时(因为必须从数据库中读入)才会感觉到缓慢。

回答

1

使用Lazy LoadData Mapper(pg.165)模式。

+0

书中只有87页!你怎么能得到第165页? – 2013-03-21 00:46:34

+0

书中有500多页。 – bancer 2013-03-21 00:52:10

1

我觉得这个问题依赖于太多的变量才能够给出具体的答案。你应该首先考虑的是你需要从数据库中读取多少数据到应用程序中。此外,您多久将数据发送回数据库并要求新数据?此外,用户是否将同时处理数据?如果是这样,最初加载数据可能不是一个好主意。

经过您的编辑,我会说这可能会更好地将数据留在数据库。如果您打算以相对较低的频率访问它,则没有理由在启动时加载或以其他方式尝试将其缓存在应用程序中。当然,只有你最了解你的应用,并且应该决定可以预先加载哪些位以提高性能。

+0

在上面增加了一些进一步的细节。 – JoeSlav 2011-03-29 19:23:09

+0

感谢皮特的意见。确实,我会以低频发回数据,但不一定我会以低频率读取数据(例如,类似树的操作,需要使用其属性获取大量节点等)。我最害怕的是用户在显示一个复杂的记录时感到缓慢(因为它必须从db读入)。 – JoeSlav 2011-03-29 19:34:56

+0

你可以做某种“预取”吗?很多时候可以告诉用户在记录保存应用程序中需要“下一步”。例如,如果您的用户正在编辑某个项目,并且位于他们需要输入信息的屏幕上,然后才能转到其他屏幕。你知道这个用户很可能会移动到下一个屏幕,以便在第一个屏幕上显示信息时在后台获取必要的数据。有很多方法可以让数据传输过程对于最终用户来说是相当透明的。 – Pete 2011-03-29 19:38:08

0

您可能会考虑在用户中间服务器(WCF)中包含内存中数据库的缓存数据,这样用户不必每次都访问数据库。另外,因为如果有人更改/添加记录,所有用户只有一个访问点,您也可以更新缓存。静态数据可以每x小时重新加载一次(例如每小时)。它仍然可能不是最好的选择,因为数据需要从服务器编组到客户端,但是如果可以的话,您可以使用netTcp绑定,这是快速和小型的。

+0

谢谢弗拉德。不幸的是,我觉得这种情况远远超出了桌面应用程序场景(即没有网络),即使我实现了从内存中获取这样一个中间层,我只是将“加载”问题转移到另一个地方/时刻。 – JoeSlav 2011-03-29 20:02:56

相关问题