Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Круговорот пользователей


Автор: N_Ghost 11.10.2011, 11:43
Привет всем.
Есть таблица с пользователями, id, name, age и тд. На страницу выводится один пользователь, и кнопка, добавить, или следующий.
Логика работы должна быть такая, один пользователь, скажем с id 1, просматривает других пользователей.
Если первый пользователь, добавляет второго пользователя, то он добавляеться другую таблицу, 
типа друзья, и в первом списке больше не показывается.
Так же, пользователь может заблокировать другого пользователя, и его тоже больше не должно 
быть в списке. Там еще много наворотов, типа выбор по параметрам, странам, случайный вывод.. 
Но это пока не сильно интересует.
Интересует именно логика, как и где лучше хранить параметры выбранных-удаленных пользователей?

Пока на ум приходит два варианта, создать еще одну таблицу, и в ней хранить user1, user2. 
Если есть запись 1 -> 2, 1 -> 3, 1 -> 5. То этих пользователей не показывать.
Не много смущает что что эта таблица очень быстро вырастет до гигантских размеров, и делать 
в ней перебор будет не очень хорошо. К тому же не совсем понятно как доставать пользователей 
из первой таблицы. Достал, проверил, следующий? Не очень логично.

Второй вариант, создать таблицу user, users, и хранить там номер пользователя, номера 
пользователей, по типу 1 -> array(2,3,5), и просматривать этот массив на предмет соответствия.
Массив в память, и базу уже не дергать. Боюсь за размеры массива. Который будет висеть в памяти.
Но проблема в принципе та же, что и в первом варианте, как доставать пользователей? Перебирать 
все возможные варианты, пока не найдем нужного? А если нужный будет сотым?

Может кто сталкивался с похожей ситуацией, помогите советом, как лучше организовать структуру.

Автор: Absinthe 11.10.2011, 12:08
N_Ghost, почему эта тема в профи?

Тебе нужны друзья и банлист? Мог вопрос одним предложением задать вместо этого месива текста?  smile 
Дополнительная таблица:

id, user_id, target_id, action

targer_id - это пользователь, которого френдит или блокирует пользователь user_id.
action может иметь значения 'friend' и 'blocked'

Если используешь постгрес, то вместо этого можно прямо в твоей основной таблице добавить поля blocked и friends типа int[] и складывать в них id.

Автор: N_Ghost 11.10.2011, 13:24
Absinthe, мне нужна логика, а не код.

Там не друзья, а не много сложнее. Но это не проблема.
Основная проблема, что для вывода случайного человека, придется бегать по всей второй таблице. Сравнивать, и только потом, или выводить, или искать следующего юзера.
Я боюсь что это может очень не плохо сказаться на нагрузке.

Но, для полного счастья, надо еще проверять, чтоб пользователь не показывался 2 раза в одном круге, это уже конечно в сессию. Которая при новом поиске, обнуляется, и все по кругу.

Вот я и спрашиваю, как рациональней такое реализовать.

Автор: Absinthe 11.10.2011, 13:35
Цитата

Основная проблема, что для вывода случайного человека, придется бегать по всей второй таблице. Сравнивать, и только потом, или выводить, или искать следующего юзера.
Я боюсь что это может очень не плохо сказаться на нагрузке.
Не понял проблемы. На чем основано "или"?

Цитата

Но, для полного счастья, надо еще проверять, чтоб пользователь не показывался 2 раза в одном круге, это уже конечно в сессию.
 Какую нафиг сессию? о_О

Сюда свой вопрос напиши в минимизированном и полном виде.

Автор: N_Ghost 11.10.2011, 16:19
Цитата(Absinthe @ 11.10.2011,  11:35)
Цитата

Основная проблема, что для вывода случайного человека, придется бегать по всей второй таблице. Сравнивать, и только потом, или выводить, или искать следующего юзера.
Я боюсь что это может очень не плохо сказаться на нагрузке.
Не понял проблемы. На чем основано "или"?

Цитата

Но, для полного счастья, надо еще проверять, чтоб пользователь не показывался 2 раза в одном круге, это уже конечно в сессию.
 Какую нафиг сессию? о_О

Сюда свой вопрос напиши в минимизированном и полном виде.

Хорошо, пойдем по порядку. Мне нужно отсечь номера пользователей с которыми уже что то сделали. Причем, часть номеров отсечь навсегда. А вторую часть, только до перезагрузки страницы, или выбора новых параметров поиска. Все это дело на mysql.

Автор: Absinthe 11.10.2011, 20:02
Цитата

Причем, часть номеров отсечь навсегда.
 Их не нужно отсекать. Их нужно просто не использовать при выборке. JOIN.

Цитата

А вторую часть, только до перезагрузки страницы, или выбора новых параметров поиска.
 Тогда сессии.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)