タイムシートアプリケーションを作成しています。私は(とりわけ)次のエンティティを持っています:
- 会社
- 従業員=会社に関連する従業員
- クライアント=会社に関連付けられているクライアント
これまでのところ、次の(省略された)データベース設定があります。
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テーブル)。
従業員が請求可能な時間を書くことができるいくつかのクライアントのプロジェクトに取り組んでいると想像してください。しかし、従業員は、雇用主(会社)によって割り当てられていないクライアントの請求可能な時間を書くことを許可されてはなりません。そのため、従業員は会社のすべてのクライアントに自動的にアクセスできるのではなく、会社が選択したクライアントにのみアクセスできます。うまくいけば、これは問題にもう少し光を当てた。