从父模型到子模型复制列。好坏练习?

时间:2016-05-18 04:00:32

标签: mysql sql laravel optimization

我有一个父模型发布和一个儿童模型评论。帖子具有隐私设置 - 数据库中的列privacy。任何时候我必须处理儿童模型评论我必须检查隐私设置,如果父模型:$comment->post->privacy

我的应用越来越大,这种方法需要越来越多的SQL请求。渴望加载有帮助,但有时除了检查隐私字段外没有其他理由触及父模型。

我的问题是:将隐私列复制到帖子表并保持同步是不错的做法?它允许我只使用$comment->privacy而不触及帖子表。

3 个答案:

答案 0 :(得分:1)

针对特定目的的计划冗余(模型的非规范化)可能很好。

您特别提到将子表上的privacy列“同步”与父表中的privacy列保持一致。这意味着您可以控制冗余。这是可以接受的做法,特别是对于提高性能。

如果它没有提高性能,那么就没有必要。

不受控制的冗余可能很糟糕。

答案 1 :(得分:1)

假设隐私属性必须在父级中(如果“帖子”不是直接使用的话,您可以随时将属性“隐私”移动给所有孩子) 首先你应该尝试使用优化技术(如索引,物化视图等)来增强性能 第二如果这对性能没有太大帮助(非常非常罕见的情况),您可以开始考虑复制信息。但这应该是你的最后一个选择,你需要采取所有可能的措施来保持数据的一致性(使用约束,触发器或其他)。

答案 2 :(得分:0)

复制列在空间方面将是BAD。假设你在帖子模型中有大量数据的情况,如果你复制它,将再次使用相同数量的空间,只是为了最小化你的时间。 基本上你总是要考虑空间和时间优化之间的权衡。 尝试通过一些算法方法来优化时间,如哈希表,索引,二进制搜索树和所有。如果您发现在一定数量的数据空间后仍然耗费时间,那么请考虑重复数据。但是请记住,性能可能会提高,但空间的使用会更多。

相关问题