在我的laravel项目中,我有很多有广告的用户,每个广告都有一些关键字:users-> ads-> keywords(数据库中有3个表)
州1:用户/广告和广告/关键字之间只有2个关系
在这种情况下,当我想访问用户的所有关键字时,我应首先获取该用户广告集合,然后使用foreach获取该用户的所有关键字。
状态2:在关键字/用户之间建立直接关系 在这个州
我可以用较少的进程直接从数据库中获取用户关键字,但不好的是我应该在关键字表中再增加一个字段(user_id)。
我的问题是这两种方式中哪一种更适合大规模优化。 在数据库中还有一个字段,更少一个foreach更好?
感谢朋友们。
答案 0 :(得分:0)
1个解决方案。如果每个ads
有多个ads
且keywords
有多个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;它很脏,因为你是复制信息)。