0

概要


私はいくつかの複雑なデータベース構造を持っており、許可されたメンバーにのみデータを提供したいと考えています。メンバーの役割は、データベース内に格納されているデータにも依存します。今までは機能していましたが、サービスを拡大したいので、とても複雑になっています。エレガントな方法が必要です。

:私はASP.NETを使用していないので、承認プロセスのモデル化についてのアイデアは受け入れていますが、ASP.NETに緊密に結びついている救済策を提案しないでください。

バックグラウンド


さて、私も以前にこの質問をしたことがありますが、驚いたことに、それ自体は良い反応が得られなかったので、ここでもう一度別の言葉で投稿します。私はWebアプリに取り組んでおり、承認プロセスをエレガントな方法でモデル化する方法に問題があります。

次のサービスを提供するアプリがあるとしましょう。何かを投稿したり、それらの投稿にコメントしたりできる「プロジェクト」/ワークスペースがあります。「オープン」と見なされるプロジェクトは「フォロー」することもできます。したがって、フォロワーはコンテンツにアクセスできます。この状況を私の実際のサービスに近づけるために、プロジェクトの「メンバー」はフォロワーがアクセスできるものを決定できます。これは複雑に見えるかもしれません(またはそうでないかもしれません!)が、実際のアプリはもっと​​複雑です。私がしたことは、SQLクエリ自体の中にフィルタリングコードを入力することでした。コードサンプルは次のとおりです。

    public function getProjectById($id) {
        $auth = new Auth();
        $userid = $auth->getCurrentUserId();


        $sql = "
          SELECT P.id, P.userId, P.name, P.description,
                 P.creationTime, P.startTime, P.endTime, P.isOpen
          FROM       projects P
          INNER JOIN project_members PM
                      ON PM.projectid = P.id
                     AND P.id = '{id}'
                     AND (PM.userId = '{userid}' OR P.isOpen = 1)
        ";

        return $this->result($sql, array( "userid" => $userid, "id" => $id ));
    }

このデータをプロジェクトフォロワーにも提供する必要があるため、これは悪いように見えます(ここには表示されていません)。そして、コメントと投稿の複雑さが増します-コードの処理。さて、これを行うためのより良い方法はありますか-あるに違いありません。承認ロジックを他のクラスに分離する必要がありますか?または/そしてデータベースで「ビュー」を使用する必要がありますか(完全に不要ですが、それでもMVCビューではないことを指摘したいと思います)?それとも、この問題を解決するためのより良い、不器用な方法はありますか?

データベース構造の変更を目的とした提案も含め、すべての提案を歓迎しますが、なぜそれが必要になるのか疑問に思います。

前もって感謝します!

4

1 に答える 1

1

ビューは正しい方向に進んでいると思いますが、各呼び出しでユーザーIDを渡す必要があるため、実際に必要なのはテーブル値関数のようです。私はMicrosoftSQLに最も精通しており、次のようになります。

SELECT P.*
FROM Projects AS P
     INNER JOIN dbo.AuthProjects(@UserID) AS AP ON P.ProjectID = AP.ProjectID

TVFは文字通りテーブルを返すことに注意してください。このテーブルに参加して、利用可能なプロジェクトを確認します。TVFの定義は次のようになります。

CREATE FUNCTION dbo.AuthProjects(@UserID INT)
    RETURNS @Results TABLE (ProjectID INT NOT NULL, WriteAccess BIT NOT NULL)
AS BEGIN
    INSERT INTO @Results (ProjectID, WriteAccess)
        SELECT
            ProjectID, WriteAccess
        FROM
            Authorizations
        WHERE
            UserID = @UserID

    -- Additional logic for more ways a project may be authorized

    RETURN
END
于 2012-04-26T19:55:48.673 に答える