提问人:BiGXERO 提问时间:9/11/2013 更新时间:4/4/2023 访问量:16992
CRUD 和 CRUDL 有什么区别?
What's the difference between CRUD and CRUDL?
问:
我不明白 和 之间的区别。根据维基百科:read
list
首字母缩略词可以扩展到 CRUDL,以涵盖大数据的列表 集合会带来额外的复杂性,例如分页,当 数据集太大,无法轻松保存在内存中
在我看来,这只是一个阅读,如果你决定支持分页,你的结果将被分页。它不会从根本上改变某人与系统交互的方式。您从根本上返回的是数据,即.如果要对结果进行分页怎么办?那么这是否使它成为一个列表?read
read
我目前正在一个项目中,我们被要求同时支持列表和读取,除了分页之外,我正在努力看到任何实现差异。
是否有其他原因您应该分离并进入自己的功能read
list
答:
我从未见过 CRUD 上下文中“列表”含义的明确定义,但我已经实现了很多使用 CRUD 方法的系统。下面是将“列表”操作与“读取”操作分开时可以考虑的一些项目:
- 其他搜索/过滤参数(而“读取”通常返回一个或所有类型的项目)
- List 方法可能会返回“浅层”对象,以便更快地访问(其中“读取”方法中的对象很大/很昂贵)
- 分页(正如您已经提到的)
- 有些人甚至可能认为所有返回多个对象的方法都是“列表”操作(其中“读取”操作只返回一个项目)
但我必须同意你的看法。这些都不会从根本上改变您与系统交互的方式。它基本上仍在读取数据,也许只是更聪明一点。
评论
read
为简单起见:
READ
获取对象。LIST
查询 ID 列表,您可以稍后使用基础对象或不查询这些 ID 。READ
社交网络 Web 示例
例如,假设您经营一个社交网络网站。
想象一下,每个对象大约有 10 或 20kB 长,因为你有很多东西(朋友列表、上次搜索、相册和照片列表、cookie、上次访问的页面、帖子列表、喜欢列表等)。User
想象一下,您有一个路由,该路由显示用户的配置文件从中获取数据并将其注入 .我们称之为 .controller
model
view
profile-page-view
很明显,必须获取所有数据才能将其传递给视图渲染器。controller
想象一下,在显示用户的 100 个最活跃的朋友时,也想象一下,您将使用所有这些信息(无法查询部分信息集)在每个特定链接、帖子、照片等中显示。profile-page-view
friends-widget
user-miniwidget
与其一次获取 100 个用户,即 10k x 100 个用户 = 从数据库中检索到的 1MB 信息,不如选择只选择配置文件中最活跃的朋友,获取 ID 而不是对象。LIST
然后让控制器只对列表的前 5 个(50kB 处理的信息)将它们吐到 HTML 中。READ
然后通过一系列 AJAX 调用读取其他 95 个...例如:
- 用户 11 到 50 以 5 个块为一组进行查询,在页面加载后 2 秒触发第一个“5 个对象操作”,并在前一个块返回后 1 秒触发每个后续块,直到列表中的用户 50。
READ
- 其余的(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;
}
}
在这种情况下,该方法最多只能实现一个读数,但无法加载其中的真实对象。如果该类别中有 100 万种花卉产品怎么办?!?!?! -那将是自杀!productFamily.getAllProductsSortedByAmountSoldLastMonth()
LIST
然后,在 for-each 循环的每次迭代中对 -implicit 调用进行每次迭代,都会执行 real 来查询 real 对象。products.getItem()
READ
总之
通常,在获得 ID 时,您可以以轻量级的方式非常轻松地管理和存储对象,以便以后是否隐藏对象。LIST
READ
很简单:
READ
返回单个项目LIST
返回项数组
评论