为简单起见:
READ
得到一个对象。
LIST
查询一个 ID 列表,您可以READ
在以后使用或不使用这些 ID。
社交网络 web 示例
例如,假设您经营一个社交网络网站。
想象一下,每个User
对象都有 10 或 20kB 长,因为你有很多东西(朋友列表、上次搜索、专辑和照片列表、cookie、上次访问的页面、帖子列表、喜欢列表等)。
还想象一下,您有一条路线,并显示controller
用户的个人资料从. 我们称它为.model
view
profile-page-view
很明显,controller
必须获取所有数据才能将其传递给视图渲染器。
想象一下,在profile-page-view
你有一个friends-widget
显示用户的 100 个最活跃的朋友,并想象你将使用所有这些信息(不能查询部分信息)来显示每个特定的user-miniwidget
链接、帖子、照片等。
与其一次获取 100 个用户,即 10k x 100 个用户 = 1MB 从数据库中检索的信息,您可以选择只获取LIST
配置文件中最活跃的朋友,获取 ID 而不是对象。
然后让控制器READ
仅将列表的前 5 个(处理信息的 50kB)吐出到 HTML。
然后通过一系列 AJAX 调用读取其他 95 个......例如:
- 用户 11 到 50 以 5 个块为一组进行查询,在页面加载 2 秒后触发第一个“5 个对象
READ
操作”,每个后续块在前一个块返回后 1 秒触发,直到列表中的用户 50。
- 其余的(50 到 100)仅在浏览器滚动到该区域或鼠标移动到附近时触发。
这是一个完全分离LIST
的例子。READ
模型 API 示例
想象一个系统模型的 API 可以帮助公司销售更多。这会计算一组产品数据。
发票有行,每行都有关联的产品。
要获得发票 4444 第 3 行的产品,您可以执行以下操作:
// Pseudo-language.
InvoiceManager invoiceManager;
Invoice invoice;
InvoiceLine line;
Product product;
invoiceManager = whateverDependencyInjectionSystemYouUse.getService( "InvoiceManager" );
invoice = invoiceManager.getInvoiceById( 4444 );
line = invoice.lines[ 3 ];
product = line.getProduct();
这将对产品执行 READ 操作。如果它是延迟加载的,READ
则在line.getProduct();
代码行上执行。
不过,如果您想查看某个产品系列的畅销产品,也许您不需要将所有产品“加载”到 RAM 中。
假设您要显示产品类别“鲜花”的 20 款畅销产品的详细信息:
// Pseudo-language.
ProductManager productManager;
ProductFamily productFamily;
Products products;
Product product;
productManager = whateverDependencyInjectionSystemYouUse.getService( "ProductManager" );
productFamily = productManager.getProductFamilyByName( "Flowers" );
products = productFamilies.getAllProductsSortedByAmountSoldLastMonth()
max = 20;
ctr = 0;
foreach( product in products )
{
dump( p );
ctr++;
if( ctr >= max )
{
break;
}
}
在这种情况下,该productFamily.getAllProductsSortedByAmountSoldLastMonth()
方法最多会实现LIST
读取,但无法加载其中的真实对象。如果该类别中有 100 万种花卉产品怎么办?!?!?!- 那将是自杀!
然后products.getItem()
在 for-each 循环的每次迭代中对 - 隐式调用的每次迭代 -READ
将执行 real 以查询真实对象。
简而言之
通常,在LIST
您获得 ID 时,您可以以轻量级的方式超级轻松地管理和存储,以便以后READ
处理或不处理后面的对象。