1

タイムシートアプリケーションを作成しています。私は(とりわけ)次のエンティティを持っています:

  • 会社
  • 従業員=会社に関連する従業員
  • クライアント=会社に関連付けられているクライアント

これまでのところ、次の(省略された)データベース設定があります。

Company
 - id  
 - name

Employee
 - id  
 - companyId (FK to Company.id)  
 - name

Client
 - id  
 - companyId (FK to Company.id)  
 - name

今、私は従業員をクライアントに関連付けたいと思っていますが、そのクライアントがその従業員が働いている会社に関連付けられている場合に限ります。データベースレベルでこのデータの整合性をどのように保証しますか?または、このデータの整合性を保証するためにアプリケーションに依存する必要がありますか?

私はこのような多対多のテーブルを作成することを考えました:

EmployeeClient  
 - employeeId (FK to Employee.id)  
 - companyId  \  (combined FK to Client.companyId, Client.id)
 - clientId   /  

したがって、従業員の会社IDとともに従業員のクライアントを挿入すると、クライアントが従業員の会社IDに関連付けられていない場合、データベースはこれを防ぐ必要があります。これは意味がありますか?これはまだ従業員が会社に関連付けられていることを保証するものではないためです。これらのことにどのように対処しますか?

更新
シナリオは次のとおりです。

  • 会社には複数の従業員がいます。従業員は1つの会社にのみリンクされます。

  • 会社には複数のクライアントもいます。クライアントは1つの会社にのみリンクされます。

    (会社は、いわばサンドボックスです)。

  • 会社の従業員は、その会社のクライアントにリンクできますが、そのクライアントが会社の顧客の一部である場合に限ります。

言い換える
と、このアプリケーションを使用すると、会社は従業員を作成/追加したり、クライアントを作成/追加したりできます(したがって、EmployeeテーブルとClientテーブルのcompanyId FK)。次に、会社は特定のクライアントを特定の従業員に割り当てることができます(EmployeeClientテーブル)。

従業員が請求可能な時間を書くことができるいくつかのクライアントのプロジェクトに取り組んでいると想像してください。しかし、従業員は、雇用主(会社)によって割り当てられていないクライアントの請求可能な時間を書くことを許可されてはなりません。そのため、従業員は会社のすべてのクライアントに自動的にアクセスできるのではなく、会社が選択したクライアントにのみアクセスできます。うまくいけば、これは問題にもう少し光を当てた。

4

2 に答える 2

0

(これは答えではありませんが、質問のコメントとしては実際には適合しませんでした。)

設計の質問に対して提示されたデータは、いくつかの質問を要求します。

  • 従業員は企業クライアントと関係がありますか?または...
  • 従業員はクライアントにのみ関連付けられており、(したがって)会社はそのクライアントに関連付けられていますか?
  • 雇用主とクライアントが会社に関連付けられている場合、従業員はその会社のすべての従業員に関連付けられていますか、それとも選択して選択する必要がありますか?

アップデート

データモデリングに関する限り、あなたがする必要があるのは、次のようにEmployeeClientの外部キーをEmployeeに拡張することだけのようです。

EmployeeClient
 - companyId
 - employeeId
 - clientId

3列すべての複合主キー。

(companyId、clientId)からClientへの
外部キー(companyId、employeeId)からEmployeeへの外部キー

したがって、EmployeeClientで定義されたすべてのリレーションでは、ClientとEmployeeの両方が同じclientIdを共有する必要があります。

于 2010-03-01T15:02:41.067 に答える
0

データベース レベルから実行する場合は、ロジックをストアド プロシージャに入れます。ストアド プロシージャ コードは、該当する場合は 2 つを関連付けますが、これは、クライアント テーブルに従業員への外部キーを配置した場合、クライアントは 1 人の従業員にのみ関連付けられることを意味します。これは、あなたの望むことですか?

また、テーブル内の従業員は、会社の関連付けを介してそのようなすべてのクライアントに間接的に関連付けられていることに注意してください。すべての従業員が会社のすべての新規クライアントに自動的に関連付けられている場合、おそらくこれをチェックするクエリを作成する必要があります。

于 2010-03-01T14:31:25.773 に答える