强制表参与的最佳方式

Ann*_*son 5 mysql database sql-server oracle database-design

我不确定什么是强制参与以下数据库设计的最佳方式(可以是SQL服务器,Oracle,mySQL等).我有两张桌子:工厂和工人.我为设计制定了两个规则:1)每个工厂雇用至少一个(或许多)工人.2)每个工人只为一个工厂工作.

我为设计创建了一个ERD:

[工厂] - || ---雇用--- | < - [工人]

FACTORY表如下所示:

Factory_ID(PK)Factory_Name

1 A
2 B
3 C.

WORKER表如下所示:

Worker_ID(PK)Worker_Name Factory_ID(FK)

1 Tom 2
2 Ann 1
3月1日

在worker表中,Factory_ID是外键(FK)并且它被设置为NOT NULL,因为(ERD表示)每个工作者必须为一个工厂工作而且只能工作一个工厂.可以通过将FK(Worker表中的Factory_ID字段)设置为非null来强制执行此参与.

这是我的问题,强制参与的最佳方式是什么 - 每个工厂雇用至少一名工人?即我需要确保每个factory_id必须至少在worker表中引用一次.因此,现在#3工厂不雇用任何违反ERD参与规则的人.

我想知道实施这种参与的最佳方式是什么?

Seb*_*bas 5

关系的1+约束通常在应用层实现.

  • 存储过程
  • 触发器
  • 后端的业务层
  • 前端
  • 以前的任何组合

问题在于有一个时间概念可以预测:有了这种限制,你需要一个工人为你的工厂,但你的工人自己需要一个工厂:这根本不可能实现这个规则同步.

解决方案可以是管理一种后台,以单独添加元素(用于管理目的),然后在公共前端实施适当的限制以匹配您的1+要求.例如:

  1. 将工人移至公司时,请检查是否至少剩下一个工作人员
  2. 在员工更换公司时实施公司更换,以确保每位员工始终只有一家公司.