какой из них важнее: оптимизируйте размер базы данных или сделайте меньше процесса - PullRequest
0 голосов
/ 06 июня 2018

в моем проекте laravel у меня много пользователей, у которых есть реклама, и у каждого объявления есть несколько ключевых слов: users-> ads-> ключевые слова (с 3 таблицами в базе данных)между пользователями / объявлениями и объявлениями / ключевыми словами

в этом случае, когда я хочу получить доступ ко всем ключевым словам пользователя, я должен сначала получить эту коллекцию пользовательских объявлений, а затем использовать foreach для получения всех ключевых слов этого пользователя.

состояние 2: установить прямую связь между ключевыми словами / пользователями в этом состоянии

я могу получить ключевые слова пользователя напрямую из базы данных с меньшим количеством процессов, но плохо то, что у меня должно быть еще одно поле (user_id) в моей таблице ключевых слов.

У меня вопрос, какой из этих двух способов более оптимизирован в больших масштабах.лучше иметь еще одно поле в базе данных с одним меньшим foreach?

спасибо друзьям.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Я думаю, что вам не хватает понятия " join ".

Модель реляционной базы данных разработана специально для разделения данных на логические объекты, которые связаны через внешние ключи.Laravel - это тонкий слой поверх этой реляционной модели.

В большинстве случаев лучше сначала создать чистую реляционную модель намного и оптимизировать ее настолько, насколько это возможно.Получите необходимую производительность вместо оптимизации по скорости с самого начала.В вашем случае я бы ожидал, что «чистая» версия (ваш вариант 1, но с объединением, а не для каждого) будет такой же быстрой, как и ваша «грязная» версия (вариант 2; она грязная, потому что вы дублируете информацию).

0 голосов
/ 06 июня 2018

1 решение. Если у каждого user есть много ads, а у ads есть много keywords, плохо добавить user_id and 'ad_id' в keywords таблицу, поскольку она должна иметь повторяющиеся ключевые слова,Правильный путь для не имеет дубликат записи, вы должны сделать 4 таблицы users, ads, keywords, ad_keyword таблиц 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();

2 решение. Вы должны составить 5 таблиц users, ads, keywords, ad_keyword, keyword_user таблиц ad_keyword, 'keyword_user - это таблица соединений, (но она не соответствуетнормализация базы данных, но полезно для большой базы данных).Для этого случая ваш код должен быть похож на этот

   $userId = 1; 
   $keywords = User::with('keywords')->where('id', $user)->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...