想象一下显示来自sqlite数据库的数据的应用程序。 该应用程序正在使用模型/视图编程。 它可以在同一数据的不同子集上并行执行多个视图(通过过滤所需数据类型生成的子集)。
(旁注:我正在使用Qt,所以当然没有控制器部分,但我找不到更合适的标签。)
我不确定采取哪种方法:
1a上。将所有数据库数据加载到一个模型中
1b中。然后将模型应用于所有视图,使用代理模型过滤视图内的数据
2a上。每个视图一个模型,但在sqlite数据库内完成过滤。
优点/缺点:
创意1:
(+)一个模型,利用模型/视图优势(例如更新所有连接的视图)
( - )内存使用率会变得很大,因为所有数据都会加载到模型中,但只会显示一个子集
创意2:
(+)因为只从数据库中加载了过滤后的数据,所以内存使用率会降低
( - )视图可以包含可能导致交叉数据的过滤器,这意味着相同的数据将存储在多个模型中 - >也许实际上甚至比Idea 1
此处加载的数据只是案例元数据,例如标题,描述,日期时间等。这里没有加载像图像,文件这样的大数据。因此,数据库确实会变得很大(对于这种应用来说很重要,比如对于高级用户来说200 gb),这不会影响当前问题的主题,因为元数据要小得多,要小得多并且与总数据量成正比,而不是数据大小。
您是否具有此类配置的实际经验并可以建议使用哪一个?在我看来,Idea 1是要走的路,但我不确定。
答案 0 :(得分:0)
根据我的经验,从数据库加载到内存中的数据越少越好。它不仅仅是内存使用,还包括启动时间。如果数据是通过网络传送的,那么加载几千兆字节可能需要永远。
所以我会选择第二个解决方案的变体,其中每个表视图都有自己的模型。该模型是QAbstractItemModel
的实现,它只是懒惰地只获取当前需要显示的行。但是,这些模型可以共享一个公共缓存。这也将确保它们在相交的位置显示相同的数据。