关系模型中OneToMany关系性能的一般设计原则

时间:2013-03-10 05:18:54

标签: sql relational schema-design

我注意到一种现在看起来非常明显的模式。 需要就此发表意见。

假设在关系模型中从表1到表2具有一对多关系。 例如,表1可以是用户表,表2可以是记录所有用户登录的登录表。一个用户可以多次登录。 给定用户,我们可以找到该用户的所有登录信息。

首先想到的是将登录存储在登录表中。这是设计之一。

但是,对于某些用例,我们对用户的特定登录感兴趣(比如上次登录),将上次登录时间缓存在用户表本身中“通常是一个好主意”。 是吗?

设计2显然是多余的,因为我们始终可以通过执行连接找到上次登录时间,然后丢弃除先前登录之外的所有登录时间。

对于一个用户要么应该没问题。但是如果你想为所有用户找到SQL查询的最后登录时间,那么设计1将涉及一个连接和一个子查询来过滤掉不需要的结果。

但是考虑到我们的用例,最好将上次登录时间存储在用户表本身中,这将使我们免于加入。是吗?

这是您在设计架构时看到的通用模式吗?

1 个答案:

答案 0 :(得分:0)

你混淆了TABLE和RELATION的概念,这是一个常见的错误。您的概念模型(用户和登录)中有两个关系,但实际上这将在您的物理模型中涉及两个以上的表格,因为非聚集索引只不过是额外的表格来加速多个关系的加入。

登录时存在INDEX(UserID,LoginTime)以支持与用户的FK关系,非聚集索引涵盖查找用户的最新登录的查询。只有当使用此默认模型识别出已知的,可测量的,严重的性能问题时,才会看到非规范化,因为这(就像所有非规范化一样)在非规范化表上引入了每个其他读取和写入操作的性能命中。