25 марта, 2011 | Нет комментариев
В продолжение решения задачи: Реляционка или не реляционка
Пройдя первый этап: MySQL vs MongoDB. Сравнение скорости insert
Создадим для 1000 пользователей системы по 100 друзей каждому (1000*100=100000 записей).
В MySQL мы имеем структуру:

Таким образом для MySQL это будет вставка записи в таблицу friends.
В MongoDB мы имеем структуру сложнее. т.к. вся информация представлена в виде большого дерева.
Мы имеем коллекцию пользователей. В которой все наши 1000 пользователей как документы.
Каждый документ имеет структуру:
- поле id_user
- массив ifriends состоящий из элементов id_friend (ссылка на другой элемент этой же коллекции users)

Понять сложно, если вы до этого ни разу не делали nosql проект. Обязательно изучите.
Ну так вот, операция создания френдов, по времени (по оси Х-время в секундах, по оси Y-количество операций с этим временем выполнения):

Вывод: тут нужно понимать, что в mysql — обычная вставка данных в таблицу, а в MongoDB — обновление существующего объекта — создание в его поле ifriend ещё одного элемента, хоть и с одним значением id_friend, но всё-же это update. Ну и мы видим, что выполнив 100000 таких операций мы имеет сравнимо одинаковые затраты по времени.
25 марта, 2011 | Нет комментариев
25 марта, 2011 | 2 Комментариев Откомментить в дискуссии
Для решения задачи Реляционка или не реляционка
Вставим 1000 записей в таблицу. Для чистоты эксперимента в таблицах уже по 10000 записей.
UPD: переделал сбор статистики и запустил на нормальном сервере. Результаты разительно другие (по Х-время в секундах, по Y-количество случаев):

Вывод: видим явно более быструю работу insert в mongodb. Нужно понимать что операции происходят в памяти, никакого обращения к диску не происходит. В обоих случаях. =)
25 марта, 2011 | Нет комментариев
Попробуем решить интересную задачу двумя способами (реляционным и не реляционным).
Допустим есть социальная сеть.
В ней есть пользователи, которые помечают других пользователей френдами.
Пользователи выкладывают какие-либо фотографии.
Задача: Для текущего пользователя вывести список всех фотографий френдов, которые этот пользователь ещё не просмотрел. О_о
Бум использовать:
php фреймворк CodeIgniter
mysql для реляционки
MongoDB для NoSql
Начальные данные:
1. создадим 1000 пользователей
2. для каждого пользователя зададим 100 друзей
3. для каждого пользователя зададим 100 фотографий (получится всего 100,000 фотографий О_о)
4. каждым пользователем посетим случайные 50 фото каждого своего друга (50*100*1000=5,000,000 записей)
5. каждым пользователем посетим случайные 1000 фото (1,000*1,000=1,000,000 ненужных записей дополнительно)
Ну и область наших интересов — быстродействие
Пока в процессе проектирования — пишите что-нить =)
25 марта, 2011 | Нет комментариев
Читаю достаточно мало. В основном гуглю. Хотелось бы отметить интересные книжки для создающих свои проекты.
Читать тут.
25 марта, 2011 | Нет комментариев
Несколько удобных прог для виндовзов.
1. dexpot
Делает много рабочих столов. Как в линупсах. Это удобно.

2. fences
Группирует ярлыки рабочего стола в группы. И ещё по двойному щелчку убирает их все. Ацко удобно.

3. Плагин для фаерфокса html -> pdf
Ну тут кому надо собственно.
16 марта, 2011 | Нет комментариев
Заболел под старость лет ветрянкой.
Уже 3-й день весь утыканый зелёнкой. Всё жутко чешется, особенно когда есть температура или вспотеешь. А температура почти всё время 38.5-39.5.
Так что слушаем беловежскую пущу, прекрасное далёко и ждём свет в конце туннеля.
Всем удачного дня.
11 марта, 2011 | Нет комментариев
Продолжаем изучать MongoDB.
На этот раз хитрое удаление.
Допустим имеется коллекция объектов:

Кликабельно
Это сайты, в которых есть поле пользователи и это поле является массивом пользователей этого сайта.
И нам нужно удалить конкретного пользователя в сайте.
Допустим мы знаем site_id и user_id пользователя внутри коллекции пользователей этого сайта.
Реализация:
$where=array('site_id'=>$site_id);
$set=array('$pull'=>array('users'=>array('user_id'=>$user_id)));
$this->db->sites->update($where,$set); |
$where=array('site_id'=>$site_id);
$set=array('$pull'=>array('users'=>array('user_id'=>$user_id)));
$this->db->sites->update($where,$set);
Разберём конструкцию.
$where — ограничиваем множество документов крупным критерием(выбрали сайт по его site_id).
$set — указываем метод(вытянуть) элемент из users(users должно быть массивом(коллекцией)), где user_id у этого элемента наш $user_id.
Красота =)
Удачного дня!
10 марта, 2011 | Нет комментариев
24 февраля, 2011 | 5 Комментариев Откомментить в дискуссии
Допустим у нас имеется коллекция сайтов, и, внутри этой коллекции хранятся данные о пользователях сайта, и их правах в этом сайте.Приведу один объект из коллекции, но их у нас много:

Задача: выбрать документы из данной коллекции, где определённый user_id находится или в первом уровне(является владельцем) или в коллекции пользователей этого сайта (является назначенным пользователем и его права определяются дополнительно).
В обычном sql у нас бы не было так вкусно расположенных данных, а было бы 2-3 таблицы связанные таблицами объединяющими их id (много ко многим) и решением было бы сделать крутой джойн или несколько запросов.
Решение в NoSQL (MongoDB, PHP):
//Подконнектимся
$this->connection = new Mongo('localhost:27017');
//Дёрним нужную базу
$this->db = $this->connection->mydb;
//Что будем искать
$user_id='fabe6e3dab8c63bb28a27b98c5c15554';
//Будем искать или сразу в первом уровне user_id или users.user_id.
//Немного непривычная форма формирования условия, но это адапрированный json, через массивы
//Примерно: or (_первое выражение_, _второе выражение_)
$data=array('$or'=>array(array('users.user_id'=>$user_id),array('user_id'=>$user_id)));
//Переберём их по-порядку, т.к. они объекты
$cursor=$this->db->sites->find($data);
$sites=array();
foreach ($cursor as $site)
{
//Сформируем массив таких сайтов удовлетворяющих условию
$sites[]=$site;
} |
//Подконнектимся
$this->connection = new Mongo('localhost:27017');
//Дёрним нужную базу
$this->db = $this->connection->mydb;
//Что будем искать
$user_id='fabe6e3dab8c63bb28a27b98c5c15554';
//Будем искать или сразу в первом уровне user_id или users.user_id.
//Немного непривычная форма формирования условия, но это адапрированный json, через массивы
//Примерно: or (_первое выражение_, _второе выражение_)
$data=array('$or'=>array(array('users.user_id'=>$user_id),array('user_id'=>$user_id)));
//Переберём их по-порядку, т.к. они объекты
$cursor=$this->db->sites->find($data);
$sites=array();
foreach ($cursor as $site)
{
//Сформируем массив таких сайтов удовлетворяющих условию
$sites[]=$site;
}
Согласитесь, красивое и удобное решение?=)
Обратите внимание, что документов в коллекции пользователей разные атрибуты.