模型/视图:预先在数据库中或在代理模型中的运行时过滤数据?

时间:2016-02-14 13:16:57

标签: c++ qt sqlite model-view-controller

想象一下显示来自sqlite数据库的数据的应用程序。 该应用程序正在使用模型/视图编程。 它可以在同一数据的不同子集上并行执行多个视图(通过过滤所需数据类型生成的子集)。

(旁注:我正在使用Qt,所以当然没有控制器部分,但我找不到更合适的标签。)

我不确定采取哪种方法:

  • 1a上。将所有数据库数据加载到一个模型中

    1b中。然后将模型应用于所有视图,使用代理模型过滤视图内的数据

  • 2a上。每个视图一个模型,但在sqlite数据库内完成过滤。

优点/缺点:

  • 创意1:

    (+)一个模型,利用模型/视图优势(例如更新所有连接的视图)

    ( - )内存使用率会变得很大,因为所有数据都会加载到模型中,但只会显示一个子集

  • 创意2:

    (+)因为只从数据库中加载了过滤后的数据,所以内存使用率会降低

    ( - )视图可以包含可能导致交叉数据的过滤器,这意味着相同的数据将存储在多个模型中 - >也许实际上甚至比Idea 1

  • 更大的内存使用量

此处加载的数据只是案例元数据,例如标题,描述,日期时间等。这里没有加载像图像,文件这样的大数据。因此,数据库确实会变得很大(对于这种应用来说很重要,比如对于高级用户来说200 gb),这不会影响当前问题的主题,因为元数据要小得多,要小得多并且与总数据量成正比,而不是数据大小。

您是否具有此类配置的实际经验并可以建议使用哪一个?在我看来,Idea 1是要走的路,但我不确定。

1 个答案:

答案 0 :(得分:0)

根据我的经验,从数据库加载到内存中的数据越少越好。它不仅仅是内存使用,还包括启动时间。如果数据是通过网络传送的,那么加载几千兆字节可能需要永远。

所以我会选择第二个解决方案的变体,其中每个表视图都有自己的模型。该模型是QAbstractItemModel的实现,它只是懒惰地只获取当前需要显示的行。但是,这些模型可以共享一个公共缓存。这也将确保它们在相交的位置显示相同的数据。