【问题标题】:which one is more important : optimize database size or make less process哪个更重要:优化数据库大小或减少进程
【发布时间】:2018-11-15 22:27:18
【问题描述】:

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

状态 1 :仅使用用户/广告和广告/关键字之间的 2 个关系来实现这一点

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

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

我可以用更少的过程直接从数据库中获取用户关键字,但不好的是我的关键字表中应该多一个字段(user_id)。

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

感谢朋友。

【问题讨论】:

  • 每个关键字只属于一个用户或者更多

标签: database laravel optimization


【解决方案1】:

1 个解决方案。 如果每个 user 有很多 ads 并且 ads 有很多 keywords 这是不好的在 user_id and 'ad_id' 表中添加 user_id and 'ad_id' 因为它必须有重复关键词。 没有重复记录的正确方法必须是创建 4 个表 users, ads, keywords, ad_keywordad_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();

2 解决方案。 你必须做5个表users, ads, keywords, ad_keyword, keyword_userad_keyword, 'keyword_user是连接表,(但它不对应数据库规范化但对大数据库有帮助)。 对于这种情况,您的代码必须与此类似

   $userId = 1; 
   $keywords = User::with('keywords')->where('id', $user)->get();

【讨论】:

  • 数据透视表的字母命名约定。你能打磨任何与此@Tpojka 相关的帖子吗
  • 当然。直接来自docs
【解决方案2】:

我认为您缺少“join”的概念。

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

大多数时候,最好先构建一个干净的关系模型,然后尽可能优化它以获得所需的性能,而不是从一开始就优化速度.在您的情况下,我希望“干净”版本(您的选项 1,但使用连接而不是 for-each)与您的“脏”版本(选项 2;它很脏,因为您正在复制信息)一样快)。

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2018-04-27
    相关资源
    最近更新 更多