【发布时间】:2013-03-29 20:09:56
【问题描述】:
我不确定强制参与以下数据库设计的最佳方式是什么(可以用于 SQL server、Oracle、mySQL 等)。我有两张桌子:工厂和工人。我为设计创建了两条规则: 1) 每家工厂至少雇用一名(或多名)工人。 2) 每个工人只为一家工厂工作。
我已经为设计创建了一个 ERD:
[工厂]-||--- 雇佣 ---|
FACTORY 表如下所示:
Factory_ID (PK) Factory_Name
1A
2 乙
3C
WORKER 表如下所示:
Worker_ID (PK) Worker_Name Factory_ID (FK)
1 汤姆 2
2 安 1
1 月 3 日
在工人表中,Factory_ID 是外键 (FK),它被设置为 NOT NULL,因为(ERD 说)每个工人必须为一个工厂工作,而且只能为一个工厂工作。这种参与可以通过将 FK(Worker 表中的 Factory_ID 字段)设置为不为空来强制执行。
这是我的问题,强制参与的最佳方式是 - 每家工厂至少雇用一名工人? IE。我需要确保每个 factory_id 必须在工作表中至少引用一次。所以现在 #3 工厂不会雇用任何违反 ERD 参与规则的人。
我想知道强制执行这种参与的最佳方式是什么?
【问题讨论】:
-
也许在应用层强制执行。不然怎么插入新工厂?它必须始终至少有一名员工,但在工厂存在之前您不能分配员工。
-
感谢您的回复!好点子。我正在考虑让应用程序强制执行。我很好奇这是否可以用数据库层来完成?例如使用延迟 FK?
-
如果所有应用程序访问都是通过存储过程完成的,那么您可以在那里执行业务规则。一个 sproc 将处理在单个事务中添加工厂及其令牌员工。如果该员工是分配到工厂的最后一名员工,则删除员工将
RaIsError。等等。拥有一个扫描 exceptions 的存储过程通常很有用,例如一个没有员工的办公室,这不应该发生,但可能发生。它们是对应用程序不是致命的条件,但应该追查并清理它们。 -
@AnnaJohnson,FK 约束不会帮助您设置 1+ 基数。您需要的是 NOT NULL 字段本身。换句话说,FK 的概念与 NOT NULL 的概念不同,不要将它们关联起来。然后你就会明白为什么推迟 FK 不会改变任何事情。
标签: mysql sql-server database oracle database-design