0

我注意到一个现在看起来很明显的模式。需要征求您对此的意见。

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

想到的第一个想法是将登录名仅存储在登录表中。这是设计一。

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

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

对于一个用户来说,两者都应该没问题。但是,如果您想通过 SQL 查询查找所有用户的上次登录时间,那么设计 1 将涉及连接和子查询以过滤掉不需要的结果。

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

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

4

1 回答 1

0

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

一旦 INDEX (UserID, LoginTime) 存在于 Logins 上以支持与用户的 FK 关系,则用于查找用户最近登录的查询将被非聚集索引覆盖。只有当使用此默认模型识别出已知的、可测量的、严重的性能问题时,才会考虑进行非规范化,因为这(与所有非规范化一样)会对非规范化表上的所有其他读取和写入操作造成性能损失。

于 2013-03-10T18:54:49.757 回答