库的数据库模式

ABa*_*ach 4 database-design

我正在为我所在大学的一个部门设计一个图书管理系统,我想着眼于我提出的架构.这篇文章主要关注我们如何存储每本书的多个副本; 关于我设计的东西让我误解了,我希望你们都能指出更好的方法来解决问题.

为了处理用户查看书籍,我设计了三个表:book,customerbook_copy.这些表之间的关系如下:

  • 本书都有很多book_copies(以避免重复书籍的信息,同时存储我们有该书的多个副本的事实).
  • 每个用户都有很多book_copies(关系的另一端)

表格本身的设计如下:

------------------------------------------------
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.
------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

关于这一点似乎不正确(或者至少对我来说效率低下) - 我的完美主义者感觉我没有正确地正常化这些数据.你说什么?是否有更好,更有效的方法来设计此架构?

谢谢!

tpd*_*pdi 6

这是一个OK架构.但是,它没有模拟作品可以有多个不同演示文稿的可能性- 也就是说,一本书可以有许多版本(以及翻译和格式).

如何切片 - 您使用的粒度 - 与数据建模一样,取决于您的使用情况.换句话说,对于你来说,爱丽丝梦游仙境的德语翻译与英语orioginal"不同" ,对你来说是"真实的" 吗?(应该是).平装版是否与精装版"不同"?

对此的简单回答是只使用ISBN作为关键 - 让出版业为您做出这些决定.然后,具有相同ISBN的任何东西都是相同且可互换的.

您可能还想要建模类似"可接受的替代品","这个ISBN是可接受的替代品,因为唯一的区别是绑定"或"这个ISBN(达尔文的起源第6版)是那个的第六版(达尔文) ; s原始的物种起源)",或"这个ISBN是那个"或甚至"这个ISBN(KJV圣经)的翻译类似于那个(NIV圣经)." 这进入了细微的渐变.

另一个更基本的问题是,同一本书的副本与这些副本的签出混在一起.如果您不幸订购了Herb Schildt的The Annotated ANSI C标准的 10份副本,但是由于您的大学学生阅读了Pete Seebach对该可怕书籍的精彩评论,这些副本的book_copy中的customer_id是什么? ?

你想(至少)书的表(work,isbn); 复制; 用户; 和关系user-checksout-copy.


Igb*_*man 5

有几件事.

我认为唯一明显的规范化错误是tpdi指出的错误:你不应该将book_copy实体与结帐记录结合起来.结帐应记录在一个单独的表中,该表将客户交叉引用到book_copy:


查看

  • customer_id(FK:customer.id)
  • book_copy_id(FK:book_copy.id)
  • date_checked_out

您在此表中并不严格需要due_date,因为您始终可以通过查看date_checked_out并添加允许签出标题的天数来计算截止日期.这提出了具有各种媒体类型和不同结帐限制的主题.例如,DVD可能有1周的限制,而书籍有2周的限制.要跟踪此信息,您还有另一个表:


checkout_limit

  • 媒体类型
  • checkout_limit_days

如果你确实有多种类型的媒体可用,那么当然你必须考虑是否需要更多的表(每种媒体类型一个)或者想要在同一个表中使用所有媒体类型(那么你必须重命名它) "预订"通用的东西).在后一种情况下,您将有一些冗余,因为某些类型的媒体不具有其他类型的属性(例如,书籍有ISBN但DVD没有).