在数据库表中有额外的数据被认为是一种不好的做法吗?

时间:2016-08-28 12:00:49

标签: mysql database database-design database-administration

考虑以下情况:

chapter(chapter_id*,book_id, chapter_no) 

book(book_id*)

user(user_id*)

position(user_id*,book_id,chapter_id*) 
  • =(组件)PRIMARY KEY

如果我想知道用户当前所在图书的哪一章,我只需使用某些用户图书查询位置表>。但问题是 Book 的外键在这里是垃圾,因为已经指定了 Book

我现在该怎么办?

2 个答案:

答案 0 :(得分:1)

它始终取决于您将对数据库执行的查询。您必须决定是否重复值以避免JOIN。

根据你提供的内容,我会删除章节表,只需使用

position(user_id*,book_id,chapter_no)

它对您的申请是否足够?

答案 1 :(得分:1)

我认为你的设计是有效的,position.book_id根本不是“垃圾”。你写道:

  

当我想知道用户当前在哪一章[...]

所以听起来用户每本书只能有一个“位置”,而您的唯一/主键应该是user_id,book_id而不是user_id,chapter_id

为了防止外键不匹配(book_idchapter_id不匹配),您可以定义复合foregn键(book_id, chapter_id) referencing chapter(book_id, chapter_id)