【问题标题】:Should I store reference data in my application memory, or in the database?我应该将参考数据存储在我的应用程序内存中还是数据库中?
【发布时间】:2011-01-16 08:40:28
【问题描述】:

我面临着为我的应用程序存储一些参考数据(基本上是下拉值)的选择。此数据不会更改(或者如果更改,我可以重新启动应用程序),并且将作为 AJAX 自动完成小部件的一部分经常访问(因此一个用户可能会对此数据进行多次查询填写一个字段)。

假设每条记录如下所示:

category
effective_date
expiration_date
field_A
field_B
field_C
field_D

自动完成查询将需要根据每个记录中的 4 个字段检查输入字符串,并根据类别和有效/到期日期检查离散参数,因此如果这是一个 SQL 查询,它将有一个 where 子句,如下所示:

... WHERE category = ? 
AND effective_date < ?
AND expiration_date > ? 
AND (colA LIKE ? OR colB LIKE ? OR colC LIKE ?)

我觉得这可能是一个相当低效的查询,但我想我对数据库如何优化其索引等方面了解不够。我知道很多非常聪明的人非常努力地工作以真正制作数据库引擎在这种确切类型的事情上速度很快。

我看到的替代方法是将它存储在我的应用程序内存中。我可以为每个类别列出这些记录,然后遍历该类别中的每个记录以查看是否满足过滤条件。这绝对是 O(n),因为我需要检查类别中的每条记录。

有没有人面临过类似的选择?您有什么见解可以提供吗?


编辑:感谢各位的洞察力。将整个数据集发送到客户端并不是一个真正的选择,因为数据集非常大(几 MB)。

【问题讨论】:

  • 对我来说,我会考虑在客户端缓存数据。
  • @David,确实有太多数据无法将其全部发送到客户端进行过滤。

标签: performance language-agnostic optimization


【解决方案1】:

你能把它硬连接到程序中吗(只要你坚持 DRY)?更改它只需要重建。

【讨论】:

  • 唯一的问题是数据需要能够在系统之外更改(更改时)。因此,规范数据需要在数据库中,并且应用程序可以在启动期间将其全部读取,或者可能在夜间计时器上读取。
【解决方案2】:

如果它在应用程序的生命周期内没有变化,则一定要将其缓存在内存中。你是对的,你不想每次调用都返回数据库,因为这完全没有必要。

关于到底要在服务器上缓存多少可能存在争议(我倾向于尽可能少地缓存,直到我真正需要为止),但对于不会更改且会重复访问的信息,您几乎应该始终缓存在 Application 对象中。

鉴于您在此数据上的方向数(过滤 6 列或更多列),我不确定您还能优化多少内存中的信息。我会尝试的第一件事是将它存储在 Application 对象的列表中,并使用 LINQ-to-objects 查询它。或者,如果有一个字段比其他字段使用得更多,或者尝试使用字典而不是列表。如果性能仍然是问题,请尝试将其存储在 DataSet 中并在其上设置索引(但当然,这样会失去一些代码的简单性和可维护性)。

【讨论】:

    【解决方案3】:

    我认为您的问题没有一个万能的答案。根据数据大小和使用模式,答案会有所不同。不仅如此,答案可能会随着时间而改变。

    这就是为什么在我的开发中我构建了一些中间层,它允许我通过更改配置来更改缓存的完成方式(无需更改代码)。每次我们分析各种统计数据(缓存命中率等)并决定是否要更改缓存行为。

    顺便说一句,还有第三层 - 您可以将静态数据推送到浏览器并缓存在那里

    【讨论】:

    • 我肯定计划有一个中间层,这样我们就可以在以后切换机制。在这一点上,我真的只是想探索这个问题。确实有太多数据无法将它们全部发送到客户端,在那里进行过滤。
    猜你喜欢
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多