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

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

更新
场景如下:

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

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

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

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

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

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

最佳答案

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

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

关于mysql - 时间表工具的数据库规范化并确保数据完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2356133/

相关文章:

mysql - 选择其中(列定义为)或 count(*) > 50 类似的东西

r - 使用 R 中的行平均值标准化数据

c# - 函数中的重复参数检查

c# - 大型数据库表的数据完整性

php - 如何确保在 MySQL 中同时对 2 个表进行相等更新

PHP mysql_connect 带有 false 变量

mysql - Mariadb 5.5 比 MySQL 5.1 慢

PHP mysql 获取两个日期之间的减法

database - 如何在数据库中建模标签?

math - 在不失去一致性的情况下将数据从 double 映射到整数的最简单方法