【问题标题】:Need help understanding the correct way of making relations between many to many tables需要帮助理解在多对多表之间建立关系的正确方法
【发布时间】:2021-01-24 13:37:02
【问题描述】:

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

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

我的关系和密钥设置是否正确以支持此逻辑?

【问题讨论】:

    标签: sql-server database-diagram


    【解决方案1】:

    首先,设计很不错!你在正确的轨道上,这是肯定的。几个(自以为是(这是你能做的最好的,因为没有一个完美的设计))cmets:

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

    【讨论】:

    • 1.感谢您的精彩提示,我已将带有 PK 的 Books_AuthorsID 列添加到 Books_Authors 和带有 PK 的 Books_CategoriesID 列到 Books_Categories 表。 2. 我的想法是,在角色中,我会有管理员、员工和客户。并且管理员拥有所有权利,员工几乎没有权利,而客户只有一些权利。在这种情况下,1 个用户应该只需要 1 个角色,而 1 个角色应该可以包含多个用户,对吗? 3. 很棒的提示,我认为它是关于每个主题的更多详细信息/信息。它添加了! 4,5 我会考虑这些。谢谢!
    【解决方案2】:

    作为一般方法,这看起来是一个很棒的开始。

    'Copies' 表上的非常好的选择 - 我想大多数人会错过第一次尝试。

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

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

    您对此的回答将影响设计——尤其是在副本和外借表周围。

    如果您只表示当前状态,那么您可能不需要 Loans 表。相反,针对每个副本,只需保存 User_ID 和相关日期。借出时,更新用户 ID 和日期;返回时,将这些日期设为 NULL。

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

    • 贷款 - 贷款状态。这可以通过日期(进/出)来推断,但拥有状态通常也很有用。另外,如果一本书丢失并且有人付费更换它会发生什么?
    • 想想贷款的 PK - 如果有人多次借同一本书(对不起 - 同一本书的副本,随着时间的推移多次),您将如何存储它?
    • 副本 - 状态。当他们迷路或者他们变得如此破烂以至于必须丢弃时会发生什么? (还有其他可能的状态,例如,当您预订书籍副本时会发生什么?)
    • 副本 - 以某种方式链接到书籍的实际物理副本(在过去的图书馆中,它们是粘贴在书脊上的条形码)

    需要考虑的其他一些事情

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

    【讨论】:

    • 状态已添加到贷款中!不错的提示。我认为,PK的贷款没有错?如果他们借出同一本书,我的建议是将ReturnDate“DueDate”延长一个额外的贷款期限。至于当一本书丢失或破烂时,这不是我考虑过的事情,这远高于我假设的编程水平。还有能够预订一本书的整个想法,这意味着我必须能够实际向图书馆预订书籍,就我的技能而言,这或多或少是一个存储应用程序,具有一些客户的附加功能可以租一本书。
    • 我不确定您对我的多对多表关系错误的意思是什么?你能解释一下吗,就我的观点而言,我认为贷款与副本有一对一的联系,因为一本书的副本一次只能借出一次,而贷款只能包括那个一次复制一本书。 ?
    • 关于您关于将副本链接到实际书籍的问题,这不是通过实际的 bookID 完成的吗?还是您的意思是在实体书上添加一种条形码?我喜欢你的想法,喜欢你的想法。但是我的程序不会像你想象的那么先进,我没有实体书,所以杜威十进制系统可能不是我在这里寻找的,但它是一个很好的细节!还有为什么我的书在与作者有多对多关系时不需要作者字段?一本书应该可以有更多的作者,作者应该可以有更多的书?
    • 重新成为多对多表中的键:查看 Books_Authors(同样适用于 Books_Categories)。目前没有 PK 强制唯一性。对于同一本书,您可以多次拥有同一作者。相反,多对多表通常将主键作为两个字段的组合,例如 BookID 和 AuthorID - 每个字段都是相关表的外键。对于 Loans 表,您的 PK CopyID 意味着每个副本只能在表中出现一次。如果您不想要历史记录(例如,在还书时删除),这很好,但如果您想保留历史记录,则不起作用。
    • 重新作者字段和多对多。对于给定的书,您可能有 2 个作者的多对多关系 - 'Jamie Smith' 的 1 行/记录和 'Bailey Lee' 的 1 行/记录。因此,您不需要 Books 表中的字段,因为数据存储在 Books_Authors 中。如果您确实也将它保存在 Books 中,并且它只显示“Bailey Smith”,那么您的数据点中至少有一个是不正确的。
    猜你喜欢
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    相关资源
    最近更新 更多