CRUD和CRUDL有什么区别?

BiG*_*ERO 11 database pagination crud function

我不明白之间的差别readlist.根据维基百科:

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

我看到这个的方式只是一个阅读,如果你决定支持分页,你的结果将被分页.它并没有从根本上改变某人与系统交互的方式.你基本上是返回数据,即read.如果你想分页read结果怎么办?这会使它成为一个列表吗?

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

还有其他原因你应该将它们分开readlist放入自己的功能中

har*_*ldK 15

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

  • 附加搜索/过滤参数("读取"通常返回一种或所有项目)
  • List方法可以返回"浅"对象以便更快地访问(来自"read"方法的对象很大/很昂贵)
  • 分页(如你所说)
  • 有些人甚至可能会考虑所有返回多个对象"list"操作的方法(其中"read"操作只返回一个项目)

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

  • 为了扩展上述内容并尝试在其上添加标签,列表似乎更像是一个目录功能,而不是返回上面建议的"实际数据"(正确).虽然它们在技术上都是"读取",但在进行谷歌搜索和获得100万个链接以及摘要一次加载20个结果之间存在很大差异,并且一次可以获得所有数百万个页面. (5认同)

Xav*_*ero 9

为简单起见:

  • READ 获取一个对象。
  • LIST查询ID列表,以后可以使用READ该ID来代替基础对象。

社交网络网站示例

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

想象一下,每个User对象的长度大约为10或20kB,因为那里有很多东西(朋友列表,最后搜索,专辑和照片列表,cookie,最后访问的页面,帖子列表,喜欢列表等)。

还要想象一下,您有一条路线,controller并且显示了一个用户的个人资料,该个人资料从中获取数据model并将其注入view。我们称它为profile-page-view

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

想象一下,profile-page-view您在其中friends-widget展示了用户的100个最活跃的朋友,并且还想象您将使用所有这些信息(无法查询部分信息)显示在每个特定的user-miniwidget链接,帖子,照片等中。

您可以选择只选择LIST概要文件中最活跃的朋友,而不是一次获得100个用户(即1万x 100个用户=从数据库中检索到1MB的信息),而不是获取对象。

然后让控制器READ仅将列表的前5个(已处理信息的50kB)分散到HTML。

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

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

这是LISTREAD完全分开的示例。

模型API范例

想象一下系统模型的API,以帮助公司销售更多产品。这将计算出一组产品数据。

发票有行,每个行都有一个关联的产品。

要获取发票4444第三行的产品,您可以执行以下操作:

// 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();
Run Code Online (Sandbox Code Playgroud)

这将对产品执行读取操作。如果是延迟加载,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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,该productFamily.getAllProductsSortedByAmountSoldLastMonth()方法LIST最多将实现读取,但是没有办法将内部的真实对象加载到内部。如果该类别中包含100万种花卉产品,该怎么办?-自杀!

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

简而言之

通常,在LIST获得ID的情况下,您可以以轻量级的方式轻松管理和存储超级READ对象,以以后再存储对象。