我正在尝试创建一个库关系数据库,其中有两个表:users和books。这种关系是一对多的:一个。用户拥有许多书籍,一本书仅由一个用户拥有。我以为book表应该有一个引用用户id的外键列。
但是如果我想获得给定用户的所有书籍,我遇到了问题。 唯一的选择是使用join查询其用户ID等于给定用户ID的书籍。 但如果有很多书,那将花费很多时间。 因此,可以建议将外键列索引为非聚簇索引。但是,图书用户组合会经常更新 - 您不会在这个图书馆中保留一天以上的图书。但我读到更新索引列通常不是最佳做法。
那我该怎么办?这种情况的最佳解决方案是什么?
答案 0 :(得分:0)
双向查询的最佳性能应包括存储关系的中间表。客户和书籍都应具有唯一的指标
中间表 - borrowing_table
列 user_id 和 book_id
您在此表中存储用户和图书索引(id)的信息,因此您可以通过user_id查询表并获取这些人借用了哪些书籍,您也可以通过books_id快速查询用户。
答案 1 :(得分:0)
您应该在book_id
上有一个索引。
您对"经常"的关注更新不适用于库设置。图书馆的工作时间为几天和几周。数据库在毫秒,秒和分钟的时间范围内工作。从数据库的角度来看,图书馆中经常出现的情况相当罕见。
那就是说,我会建议一个中间表,不是因为你在任何给定的时间点都有一个1-n的关系。相反,你有一个时间平铺的关系。所以:
create table UserBooks (
UserBookId int, -- serial, auto_increment, identity, generated always
UserId int references Users(UserId),
BookId int references Books(BookId),
FromDate datetime,
ToDate datetime,
DueDate datetime,
OverdueFees numeric(20, 4)
. . .
);
换句话说,"借用"应该是实体本身,因为有更多的信息,而不仅仅是书和用户。