1

小規模な個人プロジェクトで php/mysql を使用したプログラミングを少しやめました。ただし、顧客や企業がログインして CRUD 操作を実行できるようにする最初の商用アプリに取り組んでいます。私はこの質問をする初心者のように感じますが、これまでこれを行う必要がなく、ネット上で関連情報を見つけることができません.

基本的に、私はこのアプリを作成し、データベースにロール ベースのシステムをセットアップしました。私が直面している問題は、関連する企業またはグループのデータを分離して取得する方法です。

たとえば、クエリを次のように設定することはできません: ユーザー ID = ユーザー ID のサンプル テーブルからすべてのレコードを取得します。 . 特定のビジネスのユーザーによって作成されたすべてのレコードを取得する方法が必要です。

おそらくビジネスにはIDが必要であり、次のようにクエリを作成する必要があると考えています。ビジネスID =ビジネスIDの例からすべてのレコードを取得します。しかし、それが良いアプローチであるかどうかさえわかりません。

この並べ替えデータの保存/フェッチおよびグループ化に関するベスト プラクティスまたは規則はありますか? 注: 法的なデータを保存しているため、ここではセキュリティが大きな問題になります。

また、関連性がある場合は最新バージョンのlaravel 4を使用しています。

以前にこの種の問題に遭遇したことのある人々の考えと、その特定のビジネスに関連するデータのみを取得および保存するためにデータベースとクエリをどのように設計したかを聞きたいと思います。

編集:私は読んで学ぶのが好きですが、このトピックに関する有用な情報を見つけることができません - 正しい検索用語を使用していない可能性があります。したがって、このトピックに関連する適切なリンクを知っている場合は、それらも投稿してください。

4

1 に答える 1

2

私が正しく理解していれば、ビジネスはシステム内で「ユーザーのグループ」として定義され、システム全体がビジネスに属するデータではなく、ユーザーに属するデータを参照します。特定のビジネスに属するすべてのユーザーに属するデータを参照しようとしています。この場合、これを行うための最良かつ最も拡張可能な方法は、ビジネスとビジネスユーザー関係を含む2つのテーブルを作成することです。

たとえば、次のテーブルがあるとします。

business         => Defines a business entity
    id (primary)
    name

    Entry: id=4, name=CompanyCorp

user             => Defines each user in the system
    id (primary)
    name

    Entry: id=1, name=Geoff
    Entry: id=2, name=Jane

business_user    => Links a user to a particular business
    user_id (primary)
    business_id (primary)

    Entry: user_id=1, business_id=4
    Entry: user_id=2, business_id=4

基本的に、business_userテーブルは関係を定義します。たとえば、GeoffはCompanyCorpに関連しているため、テーブルにはそれらidの'と一致する行が存在します。これはリレーショナルデータベースモデルと呼ばれ、データベース開発の世界で理解するための重要な概念です。ユーザーが複数の異なる会社に所属することを許可することもできます。

ユーザーのすべての名前と会社の名前を検索するには、会社のID = 4 .. ..

SELECT `user`.`name` as `username`, `business`.`name` as `businessname` FROM `business_user` LEFT JOIN `user` ON (`user`.`id` = `business_user`.`user_id`) LEFT JOIN `business` ON (`business`.`id` = `business_user`.`business_id`) WHERE `business_user`.`business_id` = 4;

結果は次のようになります。

   username    businessname
-> Geoff       CompanyCorp
-> Jane        CompanyCorp

これがお役に立てば幸いです。

================================================== =============

コメントでの回答ごとの「ケース」に関する補遺。

ケースの新しいテーブルを作成し、そこにある別々の列でビジネスIDとユーザーIDの両方を参照できます。これは、ケースが必要なすべての機能である場合、ケースがユーザーとビジネスの両方に属するためです。

ただし、リレーショナルデータベースのアイデアをさらに詳しく調べて、1つのケースに複数のユーザーを割り当てたいが、1人のユーザーを「グループリーダー」として選出したい場合は、次のように問題に取り組むことができます。

  • ケースを保存するためのテーブル「ケース」を作成します
  • business_userテーブルと同様に、ケースとユーザーの関係を格納するテーブル「user_case」を作成します。

user_case次のようにテーブルを定義します。

user_case               => Defines a user -> case relationship
    user_id (primary)
    case_id (primary)
    role

    Entry: user_id=1, case_id=1, role="leader"
    Entry: user_id=2, case_id=1, role="subordinate"

さらに進んで、ユーザーが引き受けることができる役割の定義を含むテーブルを定義することもできます。次に、テーブルを変更して、さらに別のテーブルのデータを結合する代わりuser_caseに使用することもできます。role_idrole

user_case非常に小さなテーブルのスキーマがどんどん深くなっているように聞こえるかもしれませんが、リレーショナルテーブルに列を追加したことに注意してください。アプリケーションが大きくなるほど、テーブルは横方向に大きくなり、列が増えます。私を信じてください、あなたは最終的に関係を定義するためだけに新しいテーブルを追加するのをやめます。

これがどれほど柔軟であるかを簡単に示す例として、テーブルを使用すると、次のような比較的短いクエリを使用してrole、特定のユーザー(ここで)が持つすべての役割を把握できます。user_id = 6

SELECT `role`.`name` FROM `role` RIGHT JOIN `user_case` ON (`user_case`.`role_id` = `role`.`id`) WHERE `user_case`.`user_id` = 6;

さらに例が必要な場合は、コメントを続けてください。

于 2013-02-24T02:14:04.197 に答える