mysql - 数据库设计 : Circular reference and how to correct it

标签 mysql sql-server postgresql database-design circular-reference

Database design: an item is related to client and employee. And employee is related to client

这是循环引用吗?如果是这样,我该如何改进我的模型?

最佳答案

您没有任何循环引用。我将数据模型解释为:

An Item belongs to exactly 1 Client
An Item belongs to 0 or 1 Employee
An Employee belongs to exactly 1 Client

循环引用会将一个员工添加到恰好 1 个项目

在评论中,您说过一个项目总是与其员工属于同一个客户,但并非所有项目都属于一个员工。

有几种方法可以对此进行建模。

我要避免的是将 ClientID 作为 Item 上的非空外键关系 - 这重复了“没有明确客户 ID 的项目从其员工继承客户 ID”的逻辑。它没有表现力(阅读架构的人无法弄清楚这一点),并且会引发错误。

一种选择是将 item->employeeitem->client 的基数设置为可选(即 0..1)。您的约定将是如果一个项目有客户关系,它可能没有雇员关系,并且如果一个项目有雇员关系,它可能没有明确的客户关系;客户端由员工决定。 您无法在您的架构中清楚地表达这一点,并且必须将其构建到您的数据访问代码中。

另一种选择是创建两种类型的项目,一种具有 clientID 外部关系,一种具有 employeeId 外部关系。从模式的角度来看,这更具表现力——大概有一些业务概念可以用来命名表。但是,如果 Item 有很多属性,那么您就会重复很多。

最后,您可以将项目与客户或员工的关系存储在单独的连接表中:

Item
-------
ItemID
...

ItemEmployees
-----------------
ItemID
EmployeeID

ItemClients
----------
ItemID
ClientID

这避免了 Item 上属性的重复,但表现力较差,因为它使用了一种更常用于多对多关系的模式,并且没有明确声明“要么”。

关于mysql - 数据库设计 : Circular reference and how to correct it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59037629/

相关文章:

java - 将Java连接到MySQL数据库

php - 向现有 MySQL 表添加动态列?

sql-server - 无需重新排序即可返回全文搜索结果页面?

php - 从 Google Analytics 获取所有数据

php - 使用链接表值扩展模型。在cakephp3中

c# - Linq 查询转换为 SQL 弄乱了空参数值

sql-server - 需要在 SQL Server 存储过程中验证美国邮政编码

postgresql - 鹡鸰断言错误 "Unmatched tags: expected img, got p"

postgresql - 运行 Chainlink 节点 - 远程 DATABASE_URL 配置 PostgreSQL 问题

postgresql - WITH 语句中的查询是否在 PostgreSQL 的单个事务中执行?