最佳数据过滤方法

时间:2012-11-04 17:25:14

标签: node.js knockout.js

我正在构建一个小型库应用程序,以获得我的编程电子书的可视化目录。 到目前为止,我已将我的一些电子书信息添加到我的BooksViewModel.js文件中的ko.observableArray中。 稍后,我将实现一个NodeJS应用程序,其中包含MongooseDB中保存的所有数据并从那里访问它们,但到目前为止,我只是直接从Knockout.js进行实验。

默认情况下,我的图书馆会显示我添加的所有图书,这些图书都是无组织的,所以我期待按语言实现“类别”。每个书籍对象都包含一个语言属性。 我想过滤用语言显示的书籍,但我对如何做到这一点的最佳方式感到有点困惑。

阵列上的书籍没有组织,它们都被放在那里..一些关于javascript,其他C等的讨论。 首先,我考虑为每种语言创建一个分离的数组,然后在ViewModel中实现一个方法,以选择所请求语言的相应数组。

稍后,我会实现NodeJS API,通过语言来获取它们,让我们说:

GET /languages/C // will get a json corresponding all the books that talks about C

ViewModel可以包含一个方法:

self.findByLanguage = function(lang) {
   self.books = // GET /languages/:lang
};

但是每次都会查询数据库。我想最好首先加载整本书json,将它们全部保存到客户端的数组中,然后过滤它们。这样只需要一个请求。 我可以有一个包含所有书籍的全局数组,然后使用ko.utils.ArrayFilter实现过滤器。

你们认为最好的方法是什么?也许有更好的方法。

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果“我的编程电子书”意味着此应用程序仅供您使用,那么查询所有书籍和仅选定的几本书之间存在微不足道的差异,因为在这两种情况下,数据库负载通常都接近于零。书的数量可能是几百本。

但是等一下,一次加载它们的实际好处是什么?

存储整个列表客户端的好处

  • 如果您总是在查看大多数类别,那么可以节省数毫秒的数据库负载,并且只需更改类别即可节省所有带宽。

<强>缺点

  • Bandwith的使用非常糟糕,初始页面加载速度较慢,为您提供了大量您不想要或不需要的书籍。
  • 您正在使用的数据库系统将速度作为重要的优化因素。在language上添加一个索引,无论如何都应该立即进行查询。当您使用数组作为数据源时,与“仅发送整个数组”相比,这可能不会显示。
  • 在多个窗口/浏览器/多台PC上打开页面将要求您将所有更改同步到所有客户端。如果你不这样做,你将拥有旧的对象,直到你重新加载页面,这正是你应该避免的列表客户端。

如果您计划在本地计算机或本地网络中运行此程序,速度应该是一个微不足道的问题,那么为什么不让数据库完成工作呢?如果你不是,而速度是一个问题,我个人会认为“我可以快速加载X类”,“初始页面加载速度很慢,但一旦所有内容加载就会很快”。