Всем привет, вопрос такой:
На сайте надо задружить пользователей. Соответственно надо создать таблицу где будет отмечено кто с кем дружит. Вот тут меня терзают смутные сомнения...
Вижу 2 варианта решения.
Первый таблица с двумя полями user1 и user2 если запись есть значит дружат
Второй user_id и data где data массив id юзеров с которыми задружили.
Склонен ко второму но там если у юзера1 в дата есть юзер2 то надо и к юзер2 в дата его засовывать.. Или хитрый алгоритм придумать как синхронизировать или писать сразу и туду и сюда.
В первом варианте смущает количество строк.. при 50 000 пользователей количество строк получится 1249975000 арифметическая прогрессия. это же наверное большая нагрузка на базу? Или 1249975000 это мелочь для MySQL? сервер не большой 8 гигов и 4 ядра.
Что посоветуете?
1. Рачей - 19 Июля, 2016 - 08:56:56 - перейти к сообщению
2. Мелкий - 19 Июля, 2016 - 09:04:12 - перейти к сообщению
А что, у вас 50к пользователей и все дружат со всеми?
1,5 млрд записей для таблицы связей - это не много. Нагенерируйте их да посмотрите.
1,5 млрд записей для таблицы связей - это не много. Нагенерируйте их да посмотрите.
3. Рачей - 19 Июля, 2016 - 09:10:34 - перейти к сообщению
Ну вообщем да.. Ни будут дружить друг с другом. Мы их заставим)
Даже если не захотят. Кстати сейчас попробую нагенерировать.. Локально правда.
Спасибо.
(Добавление)
А в чем лучше таблицу сделать MyISAM или InnoDB ?
Даже если не захотят. Кстати сейчас попробую нагенерировать.. Локально правда.
Спасибо.
(Добавление)
А в чем лучше таблицу сделать MyISAM или InnoDB ?
4. Мелкий - 19 Июля, 2016 - 09:39:45 - перейти к сообщению
Если вам данные нужны - вам безоговорочно требуется транзакционное хранилище.
Если вам данные всё равно не нужны - берите blackhole или memory. Они хотя бы не обещают, что будут что-то хранить.
Нафига нужен myisam - понятий не имею. Одни минусы и ни одного плюса.
Если вам данные всё равно не нужны - берите blackhole или memory. Они хотя бы не обещают, что будут что-то хранить.
Нафига нужен myisam - понятий не имею. Одни минусы и ни одного плюса.
5. Рачей - 19 Июля, 2016 - 16:36:33 - перейти к сообщению
Данные нужны для поиска. Есть пара или нет, если нет то добавить. Это все что нужно.
6. Fart - 26 Июля, 2016 - 04:00:41 - перейти к сообщению
mysql - user_id (int), friends (longtext), subscribers (longtext)
1. тебе нужно подсчитать макс количество дружбанов на 1 юззера
2. выбрать в субд формат ячейки TEXT (вариантов куча - в базе читай какой для тебя удобен, могу сказать LONGTEXT - 4ккк символов. если память тянет, то все ОК)
4ккк символов - по 12 символов айдишник юзера = 33кк пользователей вписать можно!!!
3. в ячейку френдов дописываешь нового френда c разделителем
4. делаешь грамотную фильтацию и запрос в СУБД - для во избежания случаев длиииииииииииитеееееееееееельноо ооооооооогооооооооооо статуса обработки данных
5. если тебя не устраивает нагрузка на БД - создаешь файл с френдами и туда пихаеш.
6. чтобы уменьшить нагрузку при каждом подсчете пользователей - можешь реализовать что то на подобии крон-системы, которая будет подсчитывать периодически пользователей и выдавать записи в укороченном варианте.
Удачи!!!
1. тебе нужно подсчитать макс количество дружбанов на 1 юззера
2. выбрать в субд формат ячейки TEXT (вариантов куча - в базе читай какой для тебя удобен, могу сказать LONGTEXT - 4ккк символов. если память тянет, то все ОК)
4ккк символов - по 12 символов айдишник юзера = 33кк пользователей вписать можно!!!
3. в ячейку френдов дописываешь нового френда c разделителем
4. делаешь грамотную фильтацию и запрос в СУБД - для во избежания случаев длиииииииииииитеееееееееееельноо ооооооооогооооооооооо статуса обработки данных
5. если тебя не устраивает нагрузка на БД - создаешь файл с френдами и туда пихаеш.
6. чтобы уменьшить нагрузку при каждом подсчете пользователей - можешь реализовать что то на подобии крон-системы, которая будет подсчитывать периодически пользователей и выдавать записи в укороченном варианте.
Удачи!!!
7. Мелкий - 26 Июля, 2016 - 11:09:27 - перейти к сообщению
Что-то я запарился уже комментировать эти бредни записи М:М через разделитель в текстовое поле. Может, у кого другого ещё желание надавать по пальцам?
8. Fart - 26 Июля, 2016 - 11:27:15 - перейти к сообщению
если это был сарказм: ты это скажи тем, кто имеет крупные проекты на лям пользователей.. а не на пару тыщ... они явно те в лицо посмеются
9. Мелкий - 26 Июля, 2016 - 12:13:25 - перейти к сообщению
"крупный проект". "создаёшь файл". Охотно верю. И даже не смеюсь. Ну, почти.
CODE (sql):
скопировать код в буфер обмена
скопировать код в буфер обмена
- mysql> SELECT count(0) FROM tbh_favorites UNION ALL SELECT count(0) FROM tbh_users UNION ALL SELECT count(0) FROM tbh_video_votes;
- +----------+
- | count(0) |
- +----------+
- | 3289683 |
- | 375815 |
- | 1132423 |
- +----------+
Так хватит? База мелочёвка, смешные пара гигов на диске. На этом проекте таблица юзеров время от времени подчищалась, да и регистрировались очень редко - не требовали регистрацию.
У меня, к сожалению, не сохранился дамп боевой базы на 200 с лишним гигов с одного проекта, чтобы вспомнить, сколько там чего было.