На сайте, на котором я сейчас работаю, участники могут добавлять других участников. Затем, когда участник переходит на свою любимую страницу, он может видеть всех избранных им участников за все время.
Я могу сделать это двумя способами:
Метод № 1:
Каждый раз, когда пользователь выбирает другого пользователя, я добавляю в таблицу favorites
строку, которая выглядит следующим образом (индекс user_favoriting_id
):
id | user_favorited_id | user_favoriting_id
-------------------------------------------
Затем, когда они загружают страницу «Мое избранное», я делаю выборку в таблице избранного, чтобы найти все строки, в которых значение user_favoriting_id равно значению текущего зарегистрированного пользователя. Затем я беру user_favorited_ids для построения одного оператора SELECT и поиска соответствующих пользователей из отдельной таблицы пользователей.
Метод № 2:
Каждый раз, когда пользователь выбирает другого пользователя, я обновляю поле «Избранное» в его строке в таблице пользователей, которая выглядит примерно так (хотя и с несколькими полями, индекс равен id):
id | username | password | email | account_status | timestamp | favorites
--------------------------------------------------------------------------
Я СОГЛАСЕН с идентификатором привилегированного пользователя в поле favorites
, чтобы в столбце содержалась строка, разделенная запятыми, например:
10,44,67
и т.д ...
Затем для создания страницы «Избранное», как метод № 1, я просто выберу всех избранных пользователей одним нажатием. Эта часть та же самая.
Я знаю, что метод № 1 - нормализованный способ сделать это, и он намного красивее. Но моя забота об этом конкретном проекте - масштабируемость и производительность выше всего.
Если я выберу метод № 2, это уменьшит необходимость поиска в отдельной таблице избранного, поскольку таблицу пользователей придется выбирать в любом случае, как только пользователь войдет в систему.
И я вполне уверен, что использование функции разнесения в php для разделения этих значений CSV в методе # 2 не займет почти столько же времени, сколько дополнительные db метода # 1 ищут в таблице favorites
, но на всякий случай Я должен спросить:
С точки зрения производительности, какой из этих методов более оптимизирован?
Также, пожалуйста, предположите, что этот сайт будет получать триллион просмотров страниц в день.