我有三个表:动作,消息,喜欢。它定义了继承,消息和喜欢是动作的孩子(专业化)。
Message和Like都有列userId和createdAt。这些当然应该移到parrent表Action并从Message和Likes中删除。但是只有一种情况我需要从数据库中选择消息和喜欢,在其他情况下我只选择其中一个消息或喜欢。
可以在child和parrent表中复制userId和createdAt吗?它花费了磁盘空间但节省了一个连接 - 我必须加入消息,喜欢每次我需要userId和createdAt时的动作。什么,我需要更改我当前的代码...
你会建议什么?
答案 0 :(得分:2)
在我看来,这是一个过早优化的例子(或者如果你愿意的话,过早的非规范化)。您猜测连接开销会导致严重问题,因此您猜测复制userId和依赖表中的createdAt列将显着提高性能。
我建议您不要复制列,直到您知道存在真正的问题。我对墙上的性能优化进行了一些观察,以提醒自己在类似情况下应该做些什么:
还有一些关于非规范化的评论:
根据我的经验,在编写代码之前,我无法确定性能问题的发生位置。问题总是出现在我永远不会想到的地方。因此,我发现我最好的选择始终是编写最简单,最清晰的代码,尽可能简单地设计数据库,遵循规范化规则,尽我所能,然后处理什么出现了。可能仍然存在需要注意的性能问题(但是,令人惊讶的是,并非经常出现这种情况),但最终我会得到简单,清晰,易于理解/维护的代码,运行在简单,精心设计的数据库中。
分享并享受。