时间表工具的数据库规范化并确保数据完整性

时间:2010-03-01 13:40:38

标签: mysql normalization data-integrity

我正在创建一个时间表应用程序。我有以下实体(其中包括):

  • 公司
  • 员工 =与公司关联的员工
  • 客户 =与公司关联的客户

到目前为止,我有以下(缩写)数据库设置:

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表)。

想象一下,一名员工正在为少数客户开展项目,他/她可以为其编写计费小时数,但不得允许员工为其雇主(公司)未分配给他们的客户编写计费小时。因此,员工不会自动访问公司的所有客户,而只能访问公司为他们选择的客户。希望这能为这个问题提供更多的启示。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

  • 员工是否与公司客户关联?或...
  • 员工是否仅与客户关联,以及(因此)与该客户关联的公司?
  • 如果员工和客户与公司相关联,那么员工是否与该公司的所有员工相关联,或者您是否必须选择?

<强>更新

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

EmployeeClient
 - companyId
 - employeeId
 - clientId

所有三列上的复合主键。

将(companyId,clientId)上的外键导入客户端
将( companyId ,employeeId)的外键导入员工

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