Nosql

使用 NoSQL 建模文件共享權限

  • November 25, 2019

我想第一次使用 NoSQL 數據庫,並且打算使用 MongoDB。我有一個項目,員工@employeed_id可以使用 Web 應用程序獲取他可以閱讀的文件列表。如果這是一個關係數據庫,我可能會像這樣開始我的 SQL 語句來獲取他可以讀取的所有文件(我將用簡單的英語解釋我接下來要實現的目標):

SELECT * FROM t_document
WHERE EXISTS (
   SELECT 1 FROM t_user
   WHERE t_user.user_id = t_document.author_id
   AND t_user.user_id = @employee_id
) OR EXISTS (
   SELECT 1 FROM t_user
   WHERE EXISTS (
       SELECT 1 FROM t_document_share
       WHERE t_document_share.user_id = t_user.user_id
       AND t_document_share.read_access = 1
   )
   AND t_document.company_id = t_user.company_id
   AND t_user.user_id = @employee_id
) OR EXISTS (
   SELECT 1 FROM t_user
   WHERE EXISTS (
       SELECT 1 FROM t_document_group_share
       WHERE t_document_group_share.read_access = 1
       AND EXISTS (
           SELECT 1 FROM t_user_group
           WHERE EXISTS (
               SELECT 1 FROM t_user
               WHERE t_user.user_id = t_user_group.user_id
               AND t_user.user_id = @employee_id
               ...
               ...
           )
       )

   )
)

本質上,我的意思是讓我獲得至少適用以下條件之一的所有文件:

  • 我是文件的作者
  • 該文件已與我共享,我具有讀取權限,並且該文件歸我所在的公司所有
  • 該文件已與我所屬的組共享。該組對文件具有讀取權限。我、組和文件都屬於同一公司

在進行了一些快速的線上研究後,我了解到我的案例不適用於 NoSQL。在 NoSQL 中,所有這些用於調查不同實體之間關係的子查詢(以及可能的連接)都很麻煩。 所以我的問題是,有人可以確認使用 NoSQL 解決我的問題是否就像試圖讓魚爬樹一樣? 如果是這樣,那麼我會尋找其他項目來練習 NoSQL

我想我會回答我自己的問題,直到有人給出更好的答案。

當實體之間的關係是已知的並且需要保留時,這些關係在 NoSQL 數據庫中實施和執行的成本很高。查看實體之間的關係很容易使用由更多子查詢和連接組成的單個 SQL 語句來完成。與關係數據庫/SQL 方法相比,使用查找或其他 javascript/json 程式指令執行類似操作很麻煩,並且可能在計算上更加密集。

因此,在許多實體之間的關係是已知的、重要的保留和重要的執行的情況下使用 NoSQL 數據庫,就像使用牛排刀砍樹一樣。這是可以做到的,但有更好的工具來完成這項工作。

引用自:https://dba.stackexchange.com/questions/253734