CRUD 和 CRUDL 有什么区别?

What's the difference between CRUD and CRUDL?

提问人:BiGXERO 提问时间:9/11/2013 更新时间:4/4/2023 访问量:16992

问:

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

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

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

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

是否有其他原因您应该分离并进入自己的功能readlist

数据库 函数 分页 CRUD

评论

2赞 Alex D 9/11/2013
“我们被要求同时支持列表和阅读”:如果不能绝对清楚你的客户想要什么,你应该尝试获得更多细节。提供满足客户需求的东西比遵循维基百科对“R”和“L”的定义更重要。
0赞 BiGXERO 9/12/2013
我完全同意。我没有直接参与项目的这一部分,有人问我的意见,并认为我会与专家核实我是否遗漏了什么

答:

27赞 Harald K 9/11/2013 #1

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

  • 其他搜索/过滤参数(而“读取”通常返回一个或所有类型的项目)
  • List 方法可能会返回“浅层”对象,以便更快地访问(其中“读取”方法中的对象很大/很昂贵)
  • 分页(正如您已经提到的)
  • 有些人甚至可能认为所有返回多个对象的方法都是“列表”操作(其中“读取”操作只返回一个项目)

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

评论

8赞 BiGXERO 9/17/2013
为了扩展上述内容并尝试在其上添加标签,列表似乎更像是一种目录功能,而不是返回上面建议的“实际数据”。虽然它们在技术上都是,但进行谷歌搜索和一次获得 100 万个链接和摘要加载 20 个结果与一次交付所有百万个页面之间存在很大差异。read
1赞 maxwu 6/28/2021
第 2 项还考虑了安全原因,例如,数据存储桶上的 RO 角色可以访问浅层对象的集合,但它需要精细权限来访问具有(更大)详细信息的规范。
15赞 Xavi Montero 1/28/2015 #2

为简单起见:

  • READ获取对象。
  • LIST查询 ID 列表,您可以稍后使用基础对象或不查询这些 ID 。READ

社交网络 Web 示例

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

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

想象一下,您有一个路由,该路由显示用户的配置文件从中获取数据并将其注入 .我们称之为 .controllermodelviewprofile-page-view

很明显,必须获取所有数据才能将其传递给视图渲染器。controller

想象一下,在显示用户的 100 个最活跃的朋友时,也想象一下,您将使用所有这些信息(无法查询部分信息集)在每个特定链接、帖子、照片等中显示。profile-page-viewfriends-widgetuser-miniwidget

与其一次获取 100 个用户,即 10k x 100 个用户 = 从数据库中检索到的 1MB 信息,不如选择只选择配置文件中最活跃的朋友,获取 ID 而不是对象。LIST

然后让控制器只对列表的前 5 个(50kB 处理的信息)将它们吐到 HTML 中。READ

然后通过一系列 AJAX 调用读取其他 95 个...例如:

  • 用户 11 到 50 以 5 个块为一组进行查询,在页面加载后 2 秒触发第一个“5 个对象操作”,并在前一个块返回后 1 秒触发每个后续块,直到列表中的用户 50。READ
  • 其余的(50 到 100)仅在浏览器滚动到该区域或鼠标在附近移动时触发。

这是一个 和 完全分开的例子。LISTREAD

模型 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 操作。如果是延迟加载的,则在代码行上执行。READline.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;
    }
}

在这种情况下,该方法最多只能实现一个读数,但无法加载其中的真实对象。如果该类别中有 100 万种花卉产品怎么办?!?!?! -那将是自杀!productFamily.getAllProductsSortedByAmountSoldLastMonth()LIST

然后,在 for-each 循环的每次迭代中对 -implicit 调用进行每次迭代,都会执行 real 来查询 real 对象。products.getItem()READ

总之

通常,在获得 ID 时,您可以以轻量级的方式非常轻松地管理和存储对象,以便以后是否隐藏对象。LISTREAD

1赞 Wouter G. 4/4/2023 #3

很简单:

  • READ返回单个项目
  • LIST返回项数组