19

readとの違いがわかりませんlist。ウィキペディアによると:

この頭字語は CRUDL に拡張され、データ セットが大きすぎてメモリに簡単に保持できない場合に、ページ付けなどの追加の複雑さをもたらす大規模なデータ セットのリストをカバーする場合があります。

私がこれを見る方法は単なる読み取りであり、ページネーションをサポートすることにした場合、結果はページネーションされます。誰かがシステムとやり取りする方法が根本的に変わるわけではありません。基本的にデータを返していますreadreadまた、結果をページ分割したい場合はどうすればよいでしょうか? それはそれをリストにしますか?

私は現在、リストと読み取りの両方をサポートするよう求められているプロジェクトに参加していますが、ページネーション以外に、実装の違いを見つけるのに苦労しています。

独自の機能にread分離する必要がある他の理由はありますかlist

4

2 に答える 2

26

CRUD コンテキストで「リスト」が何を意味するかについての明確な定義を見たことはありませんが、CRUD アプローチを使用するかなりの数のシステムを実装しました。「リスト」操作を「読み取り」操作から分離するために考慮できるいくつかの項目を次に示します。

  • 追加の検索/フィルタリング パラメータ (「読み取り」は通常、その種類の 1 つまたはすべてのアイテムを返します)
  • リストメソッドは、アクセスを高速化するために「浅い」オブジェクトを返す場合があります (「読み取り」メソッドからのオブジェクトは大きく/高価です)。
  • ページネーション(すでに述べたように)
  • 複数のオブジェクトを返すすべてのメソッドを「リスト」操作と見なす人もいるかもしれません (「読み取り」操作は 1 つの項目のみを返します)。

しかし、私はあなたに同意しなければなりません。これらのどれも、システムと対話する方法を根本的に変えるものではありません。基本的にはまだデータを読み取っていますが、おそらく少し賢くなっています。

于 2013-09-11T08:25:17.687 に答える
14

簡単にするために:

  • READオブジェクトを取得します。
  • LISTREAD基になるオブジェクトを後で取得できるかどうかを確認できる ID のリストをクエリします。

ソーシャル ネットワーク Web の例

たとえば、ソーシャル ネットワークの Web サイトを運営しているとします。

Userオブジェクトの長さは 10 または 20kB 程度であり、大量のもの (友達のリスト、最後の検索、アルバムと写真のリスト、Cookie、最後にアクセスしたページ、投稿のリスト、いいね! のリストなど) があると想像してください。

また、ルートがありcontroller、ユーザーのプロファイルが からデータを取得し、modelそれを に注入していることを想像してくださいview。と呼びましょうprofile-page-view

controllerビュー レンダラーにデータを渡すために、すべてのデータを取得する必要があることは明らかです。

ユーザーの最もアクティブな 100 人の友人profile-page-viewfriends-widget表示し、そのすべての情報 (情報の一部のセットをクエリすることはできません) を使用して、特定のuser-miniwidgetリンク、投稿、写真などを表示するとします。

一度に 100 人のユーザー (10k x 100 ユーザー = 1 MB のデータベースから取得される情報) を取得する代わりにLIST、オブジェクトではなく ID を取得して、プロファイルの最もアクティブな友達だけを選択することもできます。

そしてREAD、リストの最初の 5 つ (50kB の処理された情報) のみにコントローラーを設定して、それらを HTML に吐き出します。

次に、一連の AJAX 呼び出しを介して他の 95 を読み取ります。たとえば、次のようになります。

  • ユーザー 11 から 50 は 5 のブロックで照会され、ページのロードの 2 秒後に最初の「5 つのオブジェクトREAD操作」をトリガーし、その後の各ブロックは前のブロックが返されてから 1 秒後に、リスト内のユーザー 50 までトリガーされます。
  • 残りのもの (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 操作が実行されます。遅延読み込みの場合は、コード行で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()実装しますが、実際のオブジェクトを内部にロードする方法はありません。そのカテゴリに 100 万個の花製品があるとしたら?!?!?! - それは自殺です!LIST

次にproducts.getItem()、for-each ループの各反復における暗黙的な呼び出しの各反復で、READ実オブジェクトを照会するために実数が実行されます。

要するに

通常、 ID を取得すると、背後LISTにあるオブジェクトかどうかに関係なく、軽量な方法で非常に簡単に管理および保存できます。READ

于 2015-01-27T20:18:55.860 に答える