哪个更重要:优化数据库大小或减少进程

时间:2018-06-06 09:33:29

标签: database laravel optimization

在我的laravel项目中,我有很多有广告的用户,每个广告都有一些关键字:users-> ads-> keywords(数据库中有3个表)

州1:用户/广告和广告/关键字之间只有2个关系

在这种情况下,当我想访问用户的所有关键字时,我应首先获取该用户广告集合,然后使用foreach获取该用户的所有关键字。

状态2:在关键字/用户之间建立直接关系 在这个州

我可以用较少的进程直接从数据库中获取用户关键字,但不好的是我应该在关键字表中再增加一个字段(user_id)。

我的问题是这两种方式中哪一种更适合大规模优化。 在数据库中还有一个字段,更少一个foreach更好?

感谢朋友们。

2 个答案:

答案 0 :(得分:0)

1个解决方案。如果每个ads有多个adskeywords有多个user_id and 'ad_id',那么添加keywords会很糟糕users, ads, keywords, ad_keyword表,因为它必须具有重复的关键字。 没有重复记录的正确方法必须是4个表ad_keyword $userId = 1; $ads = Ad::where('user_id', $userId)->get(['user_id]); $adIds = $ads->pluck('user_id')->all(); $keywords = Ad::with('keywords')->whereIn('id', $adIds)->get(); 才是连接表。 对于这种情况,您的代码必须与此类似

users, ads, keywords, ad_keyword, keyword_user

2解决方案。 你必须使5个表ad_keyword, 'keyword_user $userId = 1; $keywords = User::with('keywords')->where('id', $user)->get(); 是连接表,(但它不是对应的数据库规范化,但对大数据库有帮助)。 对于这种情况,您的代码必须与此类似

{{1}}

答案 1 :(得分:0)

我认为你错过了“join”的概念。

关系数据库模型专门用于将数据分成通过外键关联的逻辑实体。 Laravel是这个关系模型之上的薄层。

大多数情况下,首先构建一个干净的关系模型会更好 ,并尽可能地优化它以获得所需的性能,而不是从一开始就优化速度。在你的情况下,我希望“干净”版本(你的选项1,但有一个连接而不是for-each)和你的“脏”版本一样快(选项2;它很脏,因为你是复制信息)。