考虑以下情况:
chapter(chapter_id*,book_id, chapter_no)
book(book_id*)
user(user_id*)
position(user_id*,book_id,chapter_id*)
如果我想知道用户当前所在图书的哪一章,我只需使用某些用户和图书查询位置表>。但问题是 Book 的外键在这里是垃圾,因为章已经指定了 Book !
我现在该怎么办?
答案 0 :(得分:1)
它始终取决于您将对数据库执行的查询。您必须决定是否重复值以避免JOIN。
根据你提供的内容,我会删除章节表,只需使用
position(user_id*,book_id,chapter_no)
它对您的申请是否足够?
答案 1 :(得分:1)
我认为你的设计是有效的,position.book_id
根本不是“垃圾”。你写道:
当我想知道用户当前在哪一章[...]
时
所以听起来用户每本书只能有一个“位置”,而您的唯一/主键应该是user_id,book_id
而不是user_id,chapter_id
。
为了防止外键不匹配(book_id
和chapter_id
不匹配),您可以定义复合foregn键(book_id, chapter_id) referencing chapter(book_id, chapter_id)
。