2016-07-17 1 views
2

この質問はHow to filter my Doctrine queries with Symfony ACLSymfonyのACLを使用する場合、JOINクエリまたはIN配列クエリを使用する方が良いでしょうか?

  • あるクラス/エンティティ等での議論に基づいて構築します製品
  • それは我々が許可/製品これを考慮して

方法へのアクセスを制限するためにACLを使用しているデータベーステーブルの各行は、オブジェクトを表し

  • (製品)
  • にマッピングされていますユーザーがアクセスできるすべての製品のリストを取得するためにクエリを実行しますか?

    各製品を経由して、ユーザーがアクセス権を持っているかどうかを確認してください...これはすぐに悪くなります。

    前の説明では、IN配列またはJOINクエリのいずれかを使用していました。 ARRAYのアプローチでは

    製品のリストを取得するには、ユーザーが(acl_entries tableから)へのアクセスを持って、IDS、その後、products tableのINアレイクエリを実行します。

    JOINのアプローチproducts tableacl_entries tableに参加してください。

    (注意、両方のケースでparent_aclsが使用されていない)

  • 答えて

    2

    のは、両方のケースのための時間の複雑さを見てみましょう:ARRAYのアプローチでは

    M rowsエンティティ表のACLエントリアレイと

    時間複雑size N(ここでない関連するACLテーブルの行):O [N *のログ(M)]

    、O [M + N]

    実際に

    我々は、一般的のような状況があります:N rowsのACLテーブル

    時間複雑で、M rowsのエンティティ表:

    はアプローチを登録しよう

    到着配列

    N=10,000 
    M=1,000,000 
    O=>60,000 
    

    N=10,000 
    M=1,000,000 
    O=>1,010,000 
    

    に参加し、理論的には、配列のための最悪のシナリオは、ARRAY

    N=1,000,000,000 
    M=1,000,000,000 
    O=>9,000,000,000 
    

    、IN

    JOINのだろう
    N=1,000,000,000 
    M=1,000,000,000 
    O=>2,000,000,000 
    

    これは何を意味するのでしょうか?要約/ TL; DR

    各ユーザには、エンティティ内の一部のオブジェクトへのアクセスが許可されている場合は、IN配列を使用します。

    各ユーザーにエンティティのすべてのオブジェクトのACLエントリがある場合は、JOINを使用します。利益が数桁にはならないかもしれませんが(何兆もの製品がない限り)、IN配列を使いたいかもしれません。

    いずれの場合も、絶対に必要な場合にのみACLを使用してください。投票者FTW!

    関連する問題