强制参与餐桌的最佳方式
Posted
技术标签:
【中文标题】强制参与餐桌的最佳方式【英文标题】:Best way to enforce table participation 【发布时间】: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 不会改变任何事情。
【参考方案1】:
1+ 关系约束通常在应用层实现。
存储过程 触发器 后端业务层 前端 前一个的任意组合问题在于有一个时间概念需要预测:在这种限制下,您的工厂需要一名工人,但您的工人自己需要一个工厂:这根本不可能以同步方式实施此规则。
一种解决方案可能是管理一种后台以单独添加元素(出于管理目的),然后在公共前台实施适当的限制以匹配您的 1+ 要求。 例如:
-
将员工调到公司时,请检查是否至少留有一名员工
在员工更换公司时实施公司更换,以确保每位员工始终只有一家公司。
【讨论】:
以上是关于强制参与餐桌的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章