我正在为我的大学的一个部门设计一个图书馆管理系统,我想吸引您关注我提出的架构。这篇文章主要涉及我们如何存储每本书的多个副本;我设计的一些东西让我感到不舒服,我希望你们都能指出更好的方法来解决问题。
为了处理用户借书的情况,我设计了三个表:book, customer, and 书本副本。这些表之间的关系如下:
- Every book有很多书籍副本(为了避免在存储我们拥有该书的多个副本的事实时重复该书的信息)。
- Every user有很多书籍副本(关系的另一端)
表本身的设计如下:
------------------------------------------------
book
------------------------------------------------
+ id
+ title
+ author
+ isbn
+ etc.
------------------------------------------------
------------------------------------------------
customer
------------------------------------------------
+ id
+ first_name
+ first_name
+ email
+ address
+ city
+ state
+ zip
+ etc.
------------------------------------------------
------------------------------------------------
book_copy
------------------------------------------------
+ id
+ book_id (FK to book)
+ customer_id (FK to customer)
+ checked_out
+ due_date
+ etc.
------------------------------------------------
这似乎是不正确的(或者至少对我来说效率低下)——我内心的完美主义者感觉我没有正确规范化这些数据。你们说什么?有没有更好、更有效的方法来设计这个模式?
Thanks!
这是一个不错的模式。然而,它并没有模拟以下可能性:work可以有几个不同的演示文稿——也就是说,一本书可以有多个版本(以及翻译和格式)。
与数据建模中一样,您如何对其进行切片(您使用的粒度)取决于您的使用情况。换句话说,对于您来说,对于您的用法来说,德语翻译是“真实的”吗?爱丽丝漫游仙境与英文原文“不同”吗? (应该是)。平装本与精装本“不同”吗?
对此的简单答案是仅使用 ISBN 作为密钥 - 让出版业为您做出这些决定。那么,任何具有相同 ISBN 的东西都是平等且可替代的。
您可能还想建模诸如“可接受的替代品”、“这个 ISBN 是那个 ISBN 的可接受替代品,因为唯一的区别是绑定”或“这个 ISBN(达尔文的Origins第六版)是该版本的第六版(达尔文的原版)物种起源)”,或者“这个 ISBN 是那个 ISBN 的翻译”,甚至“这个 ISBN(KJV 圣经)是similar到那个(NIV 圣经)。”这进入了微妙的层次。
另一个更根本的问题是,同一本书的副本与这些副本的借阅混为一谈。如果您不幸订购了 10 份,例如 Herb Schildt 的带注释的 ANSI C 标准,但幸运的是,它们没有被签出,因为你们大学的学生读了 Pete Seebach 对那本可怕的书的精彩评论,book_copy 中那些副本的 customer_id 是什么?
你(至少)想要书籍(工作,isbn)的表格;复制;用户;以及关系 user-checksout-copy。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)