SQL泛化/专门化、数据冗余
我有三张表:动作、信息、喜欢。它定义了继承,消息和类是动作的子对象(专门化) 消息等都有userId列和createdAt列。当然,这些应该被移动到parrent表操作,并从Message和Likes中删除。但只有一种情况下,我需要从数据库中同时选择消息和喜欢的内容,在其他情况下,我只选择其中一种,消息或喜欢 在child和parrent表中复制userId和createdAt可以吗?它占用了磁盘空间,但节省了一次加入—每次需要userId和createdAt时,我都必须加入消息和操作。还有,我需要更改我当前的代码SQL泛化/专门化、数据冗余,sql,mysql,Sql,Mysql,我有三张表:动作、信息、喜欢。它定义了继承,消息和类是动作的子对象(专门化) 消息等都有userId列和createdAt列。当然,这些应该被移动到parrent表操作,并从Message和Likes中删除。但只有一种情况下,我需要从数据库中同时选择消息和喜欢的内容,在其他情况下,我只选择其中一种,消息或喜欢 在child和parrent表中复制userId和createdAt可以吗?它占用了磁盘空间,但节省了一次加入—每次需要userId和createdAt时,我都必须加入消息和操作。还有,我
你有什么建议?在我看来,这是一种过早优化(或过早非规范化,如果你愿意的话)。您猜测连接开销将导致重大问题,因此您猜测在依赖表中复制userId和createdAt列将显著提高性能 我建议您在知道存在真正的问题之前不要复制列。我在墙上贴了一些关于性能优化的观察结果,以提醒自己在类似情况下应该做什么:
- 优化实际上是你最不应该做的事情
- 更快地做错事情并没有多大好处
分享并享受。谢谢,这篇文章很棒。基本上,我应该消除重复并重写遗留代码?:-)@彼得:谢谢。如果涉及到遗留代码,则情况显然不同,并且您可能无法(由于时间限制或组织限制)重写所有内容。我的评论是针对新的数据库和代码的。这是我个人的项目,所以时间或其他什么都不重要,相关的遗留代码也不是什么大问题。从您的帖子中可以清楚地看到,在所有情况下,最好通过连接父表来获取数据,即使我只需要一个子表。