19

我不明白 和 之间的read区别list。根据维基百科:

首字母缩略词可以扩展到 CRUDL 以涵盖大型数据集的列表,这会带来额外的复杂性,例如当数据集太大而无法轻松保存在内存中时

我认为这只是一种阅读方式,如果您决定支持分页,您的结果将被分页。它不会从根本上改变人们与系统交互的方式。您从根本上返回数据,即read. 如果你想对read结果进行分页怎么办?那么这是否使它成为一个列表?

我目前在一个项目中,我们被要求同时支持列表和阅读,除了分页之外,我很难看到任何实现差异。

是否还有其他原因您应该将其分开readlist放入自己的功能中

4

2 回答 2

26

我从未见过在 CRUD 上下文中“列表”意味着什么的明确定义,但我已经实现了很多使用 CRUD 方法的系统。以下是您可能会考虑将“列表”操作与“读取”操作分开的一些项目:

  • 附加搜索/过滤参数(而“读取”通常返回一个或所有项目)
  • 列表方法可能会返回“浅”对象以加快访问速度(其中来自“读取”方法的对象很大/昂贵)
  • 分页(正如你已经提到的)
  • 有些人甚至可能会考虑返回多个对象的所有方法“列表”操作(其中“读取”操作仅返回一项)

但我必须同意你的看法。这些都不会从根本上改变您与系统交互的方式。它基本上仍在读取数据,也许只是更聪明一点。

于 2013-09-11T08:25:17.687 回答
14

为简单起见:

  • READ得到一个对象。
  • LIST查询一个 ID 列表,您可以READ在以后使用或不使用这些 ID。

社交网络 web 示例

例如,假设您经营一个社交网络网站。

想象一下,每个User对象都有 10 或 20kB 长,因为你有很多东西(朋友列表、上次搜索、专辑和照片列表、cookie、上次访问的页面、帖子列表、喜欢列表等)。

还想象一下,您有一条路线,并显示controller用户的个人资料从. 我们称它为.modelviewprofile-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处理或不处理后面的对象。

于 2015-01-27T20:18:55.860 回答