Mysql 强制表参与的最佳方法

Mysql 强制表参与的最佳方法,mysql,sql-server,database,oracle,database-design,Mysql,Sql Server,Database,Oracle,Database Design,我不确定在以下数据库设计(可以是SQL server、Oracle、mySQL等)中强制参与的最佳方式是什么。我有两张桌子:工厂和工人。我为设计创建了两条规则: 1) 每个工厂至少雇用一名(或多名)工人。 2) 每个工人只为一家工厂工作 我已经为设计创建了一个ERD: [Factory]-| |--hire----|1+关系约束通常在应用程序层实现 存储过程 触发 后端的业务层 前端 前两种方法的任意组合 问题是,有一个时间概念需要预测:在这种限制下,你的工厂需要一个工人,但你的工人自己需要

我不确定在以下数据库设计(可以是SQL server、Oracle、mySQL等)中强制参与的最佳方式是什么。我有两张桌子:工厂和工人。我为设计创建了两条规则: 1) 每个工厂至少雇用一名(或多名)工人。 2) 每个工人只为一家工厂工作

我已经为设计创建了一个ERD:


[Factory]-| |--hire----|1+关系约束通常在应用程序层实现

  • 存储过程
  • 触发
  • 后端的业务层
  • 前端
  • 前两种方法的任意组合
问题是,有一个时间概念需要预测:在这种限制下,你的工厂需要一个工人,但你的工人自己需要一个工厂:这根本不可能在一个同步工人身上实现这一规则

解决方案可以是管理一种后台,分别添加元素(出于管理目的),然后在公共战线内实施适当的限制,以满足您的1+要求。 例如:

  • 将员工调离公司时,请检查是否至少还有一名员工
  • 在员工更换公司时实施公司替换,以确保每个员工始终只有一家公司

  • 也许在应用层强制执行。否则,如何插入新工厂?它必须始终至少有一名员工,但在工厂存在之前,您无法分配员工。谢谢您的回复!说得好。我想让应用程序强制执行这一点。我很好奇数据库层是否可以做到这一点?例如,使用延迟FK?如果所有应用程序访问都是通过存储过程完成的,那么您可以在那里强制执行业务规则。一个存储过程将处理在单个事务中添加工厂及其令牌员工的问题。如果某个员工是分配给工厂的最后一名员工,则删除该员工的操作将产生错误。等等有一个扫描异常的存储过程通常很有用,例如没有员工的办公室,不应该发生但可能发生的异常。这些条件对应用程序来说并不是致命的,但应该加以追查和清理。@AnnaJohnson,FK约束不能帮助您设置1+基数。您需要的是NOTNULL字段本身。换句话说,FK的概念不同于NOTNULL,不要把它们联系起来。那你就明白为什么推迟FK不会改变什么了。