0

このシナリオに対処するためのより良い方法があるかどうか疑問に思っています。簡単ですが、ヒット数を念頭に置いて、クエリを排除しようとしています。

のリストがありBooksます。このブックに割り当てられたユーザーだけがブックやその他のコンテンツを表示できます。その基本的な API 呼び出し。/Books//Books/Chapters/、など。アクセス許可は、データベースのエントリに/Books/Chapters/Pages/関連付けられています。Books

Books、「章,ページ」などはすべて別のテーブルにあります。ユーザー権限は別のテーブルに格納されます。テーブルはこんな感じ。

    UserID,  BookID
    --------------
     101      1
     102      1
     102      2
     ... 

ユーザー情報は、API 呼び出し自体 (基本認証) から取得されます。401 Unauthorized要求された が存在する場合、API は を返す必要Bookがありますが、ユーザーにはその へのアクセス許可がありませんBook。「Book does not exist, then it should return404 Not found」をリクエストした場合。

通常、まずクエリを使用して、そのユーザーと要求された のアクセス許可を確認する必要がありBookます。そのユーザーのユーザー権限テーブルにレコードが存在する場合は、別のクエリを実行してBook、「Chapter」などを取得する必要があります。

condition that checks for the existence of the record for this user for the requested現在、これら 2 つのクエリを権限テーブルの 'WHERE EXISTS Book' と組み合わせています。そのため、レコードは、ユーザー権限テーブルにレコードがある場合にのみ返されます。

しかし、これでは、Bookが存在しないか、ユーザーにアクセス許可がないかどうかはわかりませんが、ユーザーのアクセス許可を個別に確認するために 1 つのデータベース呼び出しを削減することはできます。401これではとの区別がつかない404

区別でき、単一のクエリでこれを行うより良い方法はあり401ます404か? それとも、2 つのデータベース呼び出しを行うほうがよいのでしょうか?

あなたの考え?

4

2 に答える 2

1

このようなサブクエリを埋め込むことをお勧めします。

SELECT 
    (SELECT
         1
     FROM
         permissions
     WHERE
         permissions.user_id=<user ID> AND permissions.book_id=<book ID>)
    ) AS Permission,
    *
FROM
    books
WHERE
    books.id=<book ID>

「アクセス許可」という名前の新しい列が作成されます。これは、ユーザーがブックに対するアクセス許可を持っている場合は 1、ユーザーがアクセス許可を持っていない場合は NULL になります。

編集:「1」または「NULL」のいずれかを返すようにして、サブクエリを簡素化しました。

于 2012-11-27T18:32:22.797 に答える
0

アプリケーション ACL (アクセス制御リスト) が必要です。これにより、データベース内のさまざまなエンティティにアクセス許可を割り当てることができます。この質問を見てください

于 2012-11-27T18:28:24.587 に答える