Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как лучше организовать.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Рачей
Отправлено: 19 Июля, 2016 - 08:56:56
Post Id


Гость


Покинул форум
Сообщений всего: 94
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Всем привет, вопрос такой:
На сайте надо задружить пользователей. Соответственно надо создать таблицу где будет отмечено кто с кем дружит. Вот тут меня терзают смутные сомнения...

Вижу 2 варианта решения.
Первый таблица с двумя полями user1 и user2 если запись есть значит дружат
Второй user_id и data где data массив id юзеров с которыми задружили.

Склонен ко второму но там если у юзера1 в дата есть юзер2 то надо и к юзер2 в дата его засовывать.. Или хитрый алгоритм придумать как синхронизировать или писать сразу и туду и сюда.
В первом варианте смущает количество строк.. при 50 000 пользователей количество строк получится 1249975000 арифметическая прогрессия. это же наверное большая нагрузка на базу? Или 1249975000 это мелочь для MySQL? сервер не большой 8 гигов и 4 ядра.
Что посоветуете?
 
 Top
Мелкий Супермодератор
Отправлено: 19 Июля, 2016 - 09:04:12
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




А что, у вас 50к пользователей и все дружат со всеми?
1,5 млрд записей для таблицы связей - это не много. Нагенерируйте их да посмотрите.


-----
PostgreSQL DBA
 
 Top
Рачей
Отправлено: 19 Июля, 2016 - 09:10:34
Post Id


Гость


Покинул форум
Сообщений всего: 94
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Ну вообщем да.. Ни будут дружить друг с другом. Мы их заставимУлыбка)


Даже если не захотят. Кстати сейчас попробую нагенерировать.. Локально правда.

Спасибо.
(Добавление)
А в чем лучше таблицу сделать MyISAM или InnoDB ?
 
 Top
Мелкий Супермодератор
Отправлено: 19 Июля, 2016 - 09:39:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Если вам данные нужны - вам безоговорочно требуется транзакционное хранилище.
Если вам данные всё равно не нужны - берите blackhole или memory. Они хотя бы не обещают, что будут что-то хранить.
Нафига нужен myisam - понятий не имею. Одни минусы и ни одного плюса.


-----
PostgreSQL DBA
 
 Top
Рачей
Отправлено: 19 Июля, 2016 - 16:36:33
Post Id


Гость


Покинул форум
Сообщений всего: 94
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Данные нужны для поиска. Есть пара или нет, если нет то добавить. Это все что нужно.
 
 Top
Fart
Отправлено: 26 Июля, 2016 - 04:00:41
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


Помог: 10 раз(а)




mysql - user_id (int), friends (longtext), subscribers (longtext)

1. тебе нужно подсчитать макс количество дружбанов на 1 юззера
2. выбрать в субд формат ячейки TEXT (вариантов куча - в базе читай какой для тебя удобен, могу сказать LONGTEXT - 4ккк символов. если память тянет, то все ОК)
4ккк символов - по 12 символов айдишник юзера = 33кк пользователей вписать можно!!!
3. в ячейку френдов дописываешь нового френда c разделителем
4. делаешь грамотную фильтацию и запрос в СУБД - для во избежания случаев длиииииииииииитеееееееееееельноо ооооооооогооооооооооо статуса обработки данных
5. если тебя не устраивает нагрузка на БД - создаешь файл с френдами и туда пихаеш.
6. чтобы уменьшить нагрузку при каждом подсчете пользователей - можешь реализовать что то на подобии крон-системы, которая будет подсчитывать периодически пользователей и выдавать записи в укороченном варианте.

Удачи!!!

(Отредактировано автором: 26 Июля, 2016 - 04:07:17)

 
 Top
Мелкий Супермодератор
Отправлено: 26 Июля, 2016 - 11:09:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Что-то я запарился уже комментировать эти бредни записи М:М через разделитель в текстовое поле. Может, у кого другого ещё желание надавать по пальцам?


-----
PostgreSQL DBA
 
 Top
Fart
Отправлено: 26 Июля, 2016 - 11:27:15
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


Помог: 10 раз(а)




если это был сарказм: ты это скажи тем, кто имеет крупные проекты на лям пользователей.. а не на пару тыщ... они явно те в лицо посмеются

(Отредактировано автором: 26 Июля, 2016 - 11:29:59)

 
 Top
Мелкий Супермодератор
Отправлено: 26 Июля, 2016 - 12:13:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




"крупный проект". "создаёшь файл". Охотно верю. И даже не смеюсь. Ну, почти.

CODE (sql):
скопировать код в буфер обмена
  1. mysql> SELECT count(0) FROM tbh_favorites UNION ALL SELECT count(0) FROM tbh_users UNION ALL SELECT count(0) FROM tbh_video_votes;
  2. +----------+
  3. | count(0) |
  4. +----------+
  5. |  3289683 |
  6. |   375815 |
  7. |  1132423 |
  8. +----------+

Так хватит? База мелочёвка, смешные пара гигов на диске. На этом проекте таблица юзеров время от времени подчищалась, да и регистрировались очень редко - не требовали регистрацию.

У меня, к сожалению, не сохранился дамп боевой базы на 200 с лишним гигов с одного проекта, чтобы вспомнить, сколько там чего было.


-----
PostgreSQL DBA
 
 Top
armancho7777777 Супермодератор
Отправлено: 26 Июля, 2016 - 23:39:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Рачей пишет:
Ну вообщем да.. Ни будут дружить друг с другом. Мы их заставим)

Такого, практически, не будет. Но не суть.
Не надо выдумывать проблему в виде абстрактного коня в вакууме, и пытаться её как-то решить.
Во-вторых: в таблицу связей добавляете два составных уникальных индекса - (user_id1, user_id2) и (user_id2, user_id1).
Второй ключ необходим для обратного поиска по user_id2 (друзья друзей),
так как при поиске сравнение осуществляется от крайнего левого индекса.
Т.е. user_id1 == 21 и друзья (user_id2) 22,23,24.
Индексы будут построены на основе сбалансированных деревьев - B-tree.
B-tree (он же binary tree индекс) - это индекс, сгруппированный по листьям бинарного дерева.
Применяется для больших индексов. По сути - это индекс индексов.
Например, индексы с величиной от 1 до 10 хранятся в одной ветке, от 11 до 20 в другой и т.д..
Когда приходит запрос на индекс с номером 21, то смещается ко 2-й ветке и находит там 1-й элемент.
Нажмите для увеличения


Ну и, соответственно, тоже самое для составных индексов.
Для user_id 21 будут отфильтрованы:
2122
2123
2124
...

Отфильтруются не более userСount записей,
т.к. фильтр по одной только ветке: user_id(21) -> [.......]
Ну, и к тому же, - они уникальны.

А чтобы не подсчитывать количество друзей каждый раз при необходимости,
добавьте в таблицу пользователей поле count_friends и прибавляйте/убавляйте на единицу для обоих пользователей
при добавлении/удалении друга одного из них.
Можно соответствующие триггеры повесить для обновления данного поля.
К тому же, значение этого поля можно будет использовать для указания limit'а при выборки друзей,
для которой, в свою очередь, можно создать вьюху (VIEW) vew_friends для удобства, чтобы просто:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT name, image, email
  2.   FROM vew_friends
  3.  WHERE user_id = {$userID}
  4.  LIMIT {$countFriends}

Мелочь, тем не менее ... )

Так что, пусть они там хоть все друг с другом "зафрэндятся".
К тому же (уверен), Вам захочется получить, например, список общих друзей.
В любом случае, - проблемы решаются по мере их поступления.
Да и вертикальное масштабирование никто не отменял.
Как бы там не было оптимально, для любого, хоть самого оптимального, решения может настать момент, когда тупо не хватает ресурсов.
Или Вы думаете, известные мега-проекты так и работают на самом дорогом серверочке,
который только смог позволить себе "тот студент" в начале своего стартапа ?
А чтобы не возникали вопросы а-ля "как правильно сделать?" - больше читайте.
В данном случаю порекомендую книжку "MySQL[dot] Оптимизация производительности".

(Добавление)
Мелкий пишет:
Может, у кого другого ещё желание надавать по пальцам?

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

(Отредактировано автором: 30 Июля, 2016 - 10:53:12)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB