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 没有关联时,数据库应该阻止这种情况。这有意义吗?因为这仍然不能保证员工与公司有关联。你如何处理这些事情?

更新
场景如下:

  • 一家公司有多名员工。员工只会与一家公司联系。

  • 一家公司也有多个客户。客户只会与一家公司相关联。

    (公司是一个沙盒,可以这么说)。

  • 公司的员工可以链接到其公司的客户,但前提是客户是公司客户的一部分。

换句话说:
应用程序将允许公司创建/添加员工和创建/添加客户(因此在 Employee 和 Client 表中的 companyId FK)。接下来,公司将被允许将某些客户分配给它的某些员工(EmployeeClient 表)。

想象一个员工为几个客户工作,她/他可以为其编写计费时间,但不得允许该员工为他们的雇主(公司)未分配给他们的客户编写计费时间。因此,员工不会自动访问公司的所有客户,而只能访问公司为他们选择的客户。希望这对此事有更多的了解。

4

2 回答 2

0

如果您想从数据库级别执行此操作,那么我会将逻辑放在存储过程中。如果适用,存储的 proc 代码然后将两者关联,但这意味着(假设您将外键放在客户表中的员工中)客户端仅与一名员工相关联。这是你想要的吗?

另请注意,您表中的员工通过其公司关联与所有此类客户间接关联。如果所有员工都自动与他们公司的所有新客户相关联,那么您可能只想编写一个查询来检查这一点。

于 2010-03-01T14:31:25.773 回答
0

(这不是一个答案,但它并不真正适合作为问题评论。)

为您的设计问题提供的数据引出了许多问题:

  • 员工是否与公司客户联系在一起?或者...
  • 员工是否只与客户相关联,并且(因此)公司与该客户相关联?
  • 如果员工和客户与公司相关联,那么员工是否因此与该公司的所有员工相关联,还是必须选择?

更新

就数据建模而言,您似乎只需将 EmployeeClient 中的外键扩展为 Employee ,如下所示:

EmployeeClient
 - companyId
 - employeeId
 - clientId

所有三列的复合主键。

(companyId, clientId)
上的外键到客户 ( companyId , employeeId) 上的外键到 Employee

因此,EmployeeClient 中定义的所有关系都要求 Client 和 Employee 共享相同的 clientId。

于 2010-03-01T15:02:41.067 回答