需要帮助来理解在多对多表之间建立关系的正确方法

问题描述

enter image description here

我需要知道我在许多表之间建立的关系是否正确。 Books_Authors =书籍应该可以有多个作者,作者应该可以被分配给多个书籍,对吗?

贷款表,我的坚信是,一个用户应该能够进行多笔贷款,但是一本书的一本只能一次借出一次。对吗?

我的关系和键是否正确设置以支持这种逻辑?

解决方法

首先,设计非常好!您肯定在正确的轨道上。几个(有意见的(这是您可以做的最好的事情,因为没有一个完美的设计))注释:

  1. 每个表应具有主键。交叉引用表Book_Authors和Book_Categories当前没有PK。我会向每个表添加一个附加的代理主键,以及跨交叉引用列的唯一列约束。
  2. 用户当前仅限于1个角色。这可能导致必须处理过程代码中的层次结构。最好使用imo创建User_Roles表。
  3. 在当前缺少的地方添加其他CreatedDate列。
  4. 为具有PK的表添加唯一约束。例如,书籍可能具有唯一性(书籍名称和作者)。
  5. “贷款”表也可以/也应该具有实际的返回日期。
,

一般而言,这似乎是一个不错的开始。

在“份数”表上的收货非常好-我认为大多数人会错过第一次尝试的机会。

多对多表(Books_Authors和贷款)中的正确关系(外键)存在一些问题-我建议您看看它们。

我认为您需要考虑的问题之一是“我们是要数据仅代表当前状态还是要保留历史记录?”

您对此的回答将影响设计-特别是在“副本和贷款”表周围。

如果您仅代表当前状态,则可能不需要“贷款”表。相反,只需针对每个副本保存User_ID和相关日期。借出后,更新用户ID和日期;返回时,这些日期为NULL。

但是,如果您想要一个历史记录(我想是这样),那么您可能需要开始添加一些内容

  • 贷款-贷款状态。这可以通过日期(输入/输出)来推断,但是具有状态通常也很有用。而且,当丢失一本书并且有人付费更换它时会发生什么?
  • 考虑一下贷款的PK-如果某人多次借用同一本书(对不起,同一本书的副本,一段时间内多次借用),您将如何存储?
  • 份数-状态。当他们迷路或被撕碎以致必须丢弃时会发生什么? (还有其他可能的状态,例如,当您预订书籍副本时会发生什么情况?)
  • 份数-链接到该书的实际物理副本的一种方式(在过去的图书馆中,它们是粘贴在书脊上的条形码)

还有两件事要考虑

  • 您的图书有一个“作者”字段,然后是多对多作者。可以...但是可能不是您想要的
  • 图书馆(至少在过去使用过)对图书使用杜威十进制系统吗?您可能也要添加它。