gpt4 book ai didi

mysql - 建立三个表之间关系的正确方法

转载 作者:搜寻专家 更新时间:2023-10-30 21:49:42 27 4
gpt4 key购买 nike

我正在构建一个图书馆数据库,但我被困在一件特定的事情上。

我有三个表:BookCopyBookLoanMembers。我不清楚如何建立它们之间的关系,所以成员(member)可以借一本书(或几本书),所有这些都可以正确反射(reflect)在我的数据库中。

我的想法是有两个多对多表,所以我添加了 BoakLoansMembersBookCopiesBookLoans 。我不确定这是否正确,即使正确,我也不知道如何对这么多表进行 scipt。

那么,现在我想知道在这种情况下最好的做法是什么,为什么?

enter image description here

最佳答案

我猜你的 BookCopy 是为了解释 Y 书的 X 份副本,从这个意义上说,“书”不是借出的,而是它们的“副本”,对吧?

我认为最好的做法可能是实现 BookLoan 表应该是多对多表。一次借给成员(member)一份,然后归还。 BookLoad 应该有副本和成员的 id,以及借出日期(就像你现在拥有的那样,尽管它应该是一个日期时间字段而不是一个 varchar 字段)和归还日期(比如借出日期,它应该是一个日期时间,但也应该可以为空以表示未归还的副本)。您还应该保留贷款的唯一(大概是自动递增)ID,因为成员(member)很可能会多次 checkout 同一份副本。

我猜您最初可能将“贷款”概念化为类似于销售交易的概念,这可能行得通;但您可能需要一个 loanCopies 表,并且不希望贷款上有 dateReturned,因为可以单独归还不同的副本。


编辑(补充观察):

  • isAvailable 可能是多余的,如果它仅基于副本是否被 checkout (如果您想阻止这本书流通,它可能是合适的)
  • 根据维基百科,ISBN 最多为 13 个字符(在某些情况下,char van 比 varchar 更有效)
  • 您可能需要考虑副本可以引用的语言表,而不是使用字符串类型字段。

编辑(重新:isAvailable):如果您只需要查找未借出的副本,您只需要像这样的简单查询。

SELECT * 
FROM BookCopy
WHERE idBookCopy NOT IN (
SELECT idBookCopy
FROM BookLoan
WHERE dateReturned IS NULL
);

子查询获取借出的副本列表,NOT IN 确保结果中的副本不在该列表中。

如果您想防止副本被借出(损坏、破坏等...),isAvailable“标志”可能是添加此类功能的简单方法;只需将 AND isAvailable = 1 添加到外部查询的 WHERE 条件即可。

关于mysql - 建立三个表之间关系的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41048075/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com