我应该索引一个经常更新的外键吗?

时间:2017-10-21 09:55:50

标签: sql indexing database-design foreign-keys relational-database

我正在尝试创建一个库关系数据库,其中有两个表:users和books。这种关系是一对多的:一个。用户拥有许多书籍,一本书仅由一个用户拥有。我以为book表应该有一个引用用户id的外键列。

但是如果我想获得给定用户的所有书籍,我遇到了问题。 唯一的选择是使用join查询其用户ID等于给定用户ID的书籍。 但如果有很多书,那将花费很多时间。 因此,可以建议将外键列索引为非聚簇索引。但是,图书用户组合会经常更新 - 您不会在这个图书馆中保留一天以上的图书。但我读到更新索引列通常不是最佳做法。

那我该怎么办?这种情况的最佳解决方案是什么?

2 个答案:

答案 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)
    . . .
);

换句话说,"借用"应该是实体本身,因为有更多的信息,而不仅仅是书和用户。