我有一张包含所有已注册members
的表格,其中包含uid
,username
,last_action_time
等列。
我还有一张表,可以跟踪过去5分钟内online
的成员。它由cronjob填充,从members
提取数据,last_action_time
不到5分钟。
问题:我的online
表格应该包括username
还是否?我问这个是因为我可以JOIN
两个表来获取这些数据,但是我可以将username
存储在online
表中而不必加入。我担心的是,我将把重复的数据存储在两个表中,这似乎是错误的。
答案 0 :(得分:1)
这种方法称为非规范化。我的意思是有时为了快速选择查询,我们必须跨表复制一些数据。在这种情况下,如果两个表中都有大量数据,我相信这个是很好的选择。
答案 1 :(得分:1)
如果您没有遇到性能问题,请勿进行非规范化。有一句好话“正常化直到它受伤,反正常化直到它起作用”。在您的情况下,它适用于规范化架构(加入用户表)。数据库旨在处理大量数据。
答案 2 :(得分:1)
您刚刚提出了一个非常有效的问题:何时复制数据才有意义?
我可以将您的问题重写为:何时使用缓存是有意义的。缓存需要维护,您需要自己更新它们并且它们占用了一些额外的空间(在这种情况下可以忽略不计)。但他们有一个专业:性能提升。
在您提到的示例中,您需要查看性能提升是否真的值得,以及它是否超过了拥有和维护缓存的额外工作。
我的直觉是你的数据库并不庞大,所以每次加入都需要从服务器上花费很少的精力,所以我会继续使用它。
希望有所帮助
答案 3 :(得分:0)
您不应将用户名存储在在线表格中。不应该有任何性能问题。每次只需使用联接来获取用户名。
另外,您根本不需要联机表,为什么不查询具有last_action_time<的用户?会员表5分钟?
答案 4 :(得分:0)
用户ID是整数(AKA 4字节)。用户名(我想象的最多16个字节)。有多少用户?如何更改用户名?这些是需要考虑的问题。
我只会存储用户名。我想,但是一旦用户名被注册,它就会被修复一段时间。
如果在没有一点背景的情况下很难回答这些问题 - 当深度和呼吸,使用情况等未知时,很难想到性能问题。