Форум программистов, компьютерный форум, киберфорум
MongoDB
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
363 / 334 / 38
Регистрация: 29.03.2011
Сообщений: 838
1

Как организовать данные, использующие JOIN?

29.05.2013, 16:02. Показов 2374. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Недавно начал знакомство с nosql-движками, пока эксперементирую. Решил сделать аналог существующей SQL базы.
Есть таблицы:
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE `users` (
  `id` int AUTO_INCREMENT,
  `name` varchar,
-- ...
)
CREATE TABLE `users_block` (
  `user0` int,
  `user1` int,
  `block` int,
)
CREATE TABLE `orders` (
  `id` bigint AUTO_INCREMENT,
  `user0` int,
  `user1` int,
-- ...
)
И основной рабочий запрос (показываем юзеру заказы всех юзеров, кроме тех, кто ему явно запретил (есть запись в users_block)).:
MySQL
1
2
3
SELECT * FROM `orders` o LEFT JOIN `users_block` u 
ON (u.`user0`=o.`user0` AND u.`user1`='{user_id}')
WHERE u.`block` IS NULL AND --дальше фильтры по полям `orders`
Помогите организовать подобную логику на NoSQL (mongo или redis).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2013, 16:02
Ответы с готовыми решениями:

нужно вывести данные. думаю с join, но как?
есть таблицы из которых нужно вывести данные есть таблицы otdel c idotdel из таблицы people...

Как записать Left Join (Right Join) при помощи Linq, используя fluent-синтаксис
Как записать Left Join (Right Join) при помощи Linq используя fluent - синтаксис? У меня есть...

Как лучше организовать данные
Добрый день. Создаю класс CError для хранения в нём ошибок. От класса требуется хранить информацию...

Создание БД. Как организовать данные?
Приветствую! Серьезного опыта по созданию БД - 0 xp Я хочу создать две базы данных, одна...

3
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
30.05.2013, 15:28 2
Не совсем понял, зачем в users_block поле block и зачем в orders два поля user.

И user0 и user1 стоило бы переименовать более осмысленно, типа owner(для orders) и т.д.

Разве это не то же самое, что и
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE `users` (
  `id` int AUTO_INCREMENT,
  `name` varchar,
-- ...
)
CREATE TABLE `users_block` (
  `user` int,
  `blocked_user` int,
)
CREATE TABLE `orders` (
  `id` bigint AUTO_INCREMENT,
  `owner` int,
-- ...
)
MySQL
1
2
3
4
SELECT o.*
FROM `orders` o
WHERE o.`owner` NOT IN (SELECT `user` FROM `users_block` WHERE `blocked_user` = {user_id})
AND --дальше фильтры по полям `orders`
?

Если да, то примерно так (монго):
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
// user document:
{
  name: <name>,
  blocks: [ <user_id> /* , ... */ ]
  // , ...
}
 
// order document:
{
  owner_user: ...,
  blocked_for: [<user_id> /* , ... */ ]
  // , ...
}
Соответственно выборка будет примерно такой (JS и монгу не очень хорошо знаю):
Javascript
1
db.orders.find({blocked_for: {$eq: <user_id> }})
Конечно при изменении списка блокировки придется обновлять все заказы пользователя.

Хорошее пояснение тут: http://stackoverflow.com/quest... ct-queries

Так же там есть предложение определить в БД функцию, если это работает, то можно получить список блокировки функцией и выбирать заказы примерно так:
Javascript
1
db.orders.find({owner: {$in: get_blockers() }})
Или хранить в документе пользователя список пользователей, которыми он заблокирован и передавать его параметром.
0
363 / 334 / 38
Регистрация: 29.03.2011
Сообщений: 838
30.05.2013, 23:49  [ТС] 3
korvin_, block использую как набор флагов, в данном запросе важно лишь наличие записи, в других местах разбирается содержимое: блокировку может поставить и user0 (не хочу видеть заказы user1) и user1 (не хочу видеть заказы user0), их начальник или админ (tiyint пока на всех хватает, если придётся ещё перегружать - поменяю на create_user). user0, user1 - это ForeignKey, называть их так во всех таблицах удобнее - сразу понятно, кто это и не надо потом вспоминать, что и как обозвал. Да, в orders 2 ссылки, потому-что создатель (user0) и исполнитель (user1) чаще всего разные (но может быть и один, тогда user1=user0).

Как я понял - вы предлагаете хранить информацию о блокировках прямо в заказе. Не раздует ли это базу почём зря? Пока читал ссылку, пришло в голову разбить запрос на 2:
а) Выбрать всех, чьи заказы user0 видеть не должен (можно хранить в таблице users)
б) Выбрать заказы, чей создатель не в первом списке.
На sql это делается средствами движка, чтобы данные зря не гонять, если запрос будет быстрее, почему нет?.
Позже проверю, что получилось.
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
31.05.2013, 08:13 4
Цитата Сообщение от sKotenok Посмотреть сообщение
Как я понял - вы предлагаете хранить информацию о блокировках прямо в заказе. Не раздует ли это базу почём зря?
Может и раздует, но это, в некотором смысле, «Mongo-way» — встраивание документов.
0
31.05.2013, 08:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2013, 08:13
Помогаю со студенческими работами здесь

Посоветуйте как организовать данные работы приложения
Всем привет! Хочу написать приложение, которое будет работать с крошечной базой данных (таблички...

Как организовать данные в xml файле и связать их с listView
Здравствуйте. В виду нюансов учебного процесса, пришлось делать по wpf программу, не имея...

Как организовать стрим, передающий данные из апплета сервлету?
Как организовать стрим, передающий данные из апплета сервлету? Я создавал объект HttpURLConnection...

Лишние данные при JOIN
Имеются 2 таблицы en_users, en_tasks(пользователи и задания) При JOIN запросе, к примеру, SELECT...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru