强制参与餐桌的最佳方式

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+ 要求。 例如:

    将员工调到公司时,请检查是否至少留有一名员工 在员工更换公司时实施公司更换,以确保每位员工始终只有一家公司。

【讨论】:

以上是关于强制参与餐桌的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

袋鼠云日志全民找BUG!寻找最佳产品体验报告

分桶问题变体的最佳方法

云原生架构-最佳实践-日志规约

计算大 Mandelbrot 图像的最佳方法

展开可选类型的最佳方法[重复]

分布式事务 -- 最佳实践方案汇总 -- 看这1篇就够了