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。如果请求“does not exist, then it should return未找到图书 404”。

通常,首先我需要通过查询检查该用户和请求的权限Book。如果该用户的用户权限表中存在该记录,那么我应该运行另一个查询以获取Book“章节”等。

目前,我正在将这两个查询与condition that checks for the existence of the record for this user for the requested权限表中的“WHERE EXISTS Book”结合起来。所以只有在用户权限表中有记录时才会返回记录。

但是有了这个,我不知道Book是不存在还是用户没有权限,尽管我可以减少一个数据库调用来单独检查用户权限。有了这个,我无法区分401404

有没有更好的方法来做到这一点,同时能够区分401404使用单个查询?还是最好进行两次数据库调用?

你的意见?

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>

您将有一个名为“Permission”的新列,如果用户有权限,则该列为 1,如果用户没有该书的权限,则为 NULL。

编辑:我通过让它返回“1”或“NULL”来简化子查询。

于 2012-11-27T18:32:22.797 回答
0

您需要拥有您的应用程序 ACL(访问控制列表),这样您就可以将权限分配给数据库中的各种实体。看看这个问题

于 2012-11-27T18:28:24.587 回答