Взаимосвязанные запросы MySQL, аналог в MongoDB
Добрый день, дорогие коллеги, я решил перенести несколько проектов из MySQL в MongoDB и столкнулся с несколькими трудностями:
Например, в MySQL есть две таблицы:
Пользователи:
CREATE TABLE `testdb`.`users` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 55 ) NOT NULL ,
`password` VARCHAR( 32 ) NOT NULL
) ENGINE = MYISAM
Правила:
CREATE TABLE `testdb`.`rules` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL ,
`title` VARCHAR( 155 ) NOT NULL ,
`points` INT NOT NULL
) ENGINE = MYISAM
Теперь, чтобы выбрать все "правила", которые принадлежат конкретному пользователю, я могу сделать запрос SQL:
SELECT r.`title`, r.`points` FROM `rules` r, `users` u WHERE r.`uid` = u.`id` AND u.`id` = '123'
В настоящее время я не могу понять, как сделать то же самое в MongoDB, не могли бы вы объяснить и привести пример.
PS Я делаю реализацию в Python с помощью Pymongo PPS. Я также хотел увидеть альтернативные способы решения этой проблемы с помощью ORM mongoengine или mongokit.
Заранее спасибо:)
1 ответ
MongoDB не поддерживает соединения, в отличие от RDBMS, как mysql. И это потому, что MongoDB не является реляционной базой данных. Поэтому моделирование данных в MongoDB таким же образом, как и в СУБД, обычно является плохой идеей - вы должны разрабатывать свои схемы в совершенно ином мышлении.
В этом случае, например, в MongoDB у вас может быть 1 документ на пользователя, причем правила, принадлежащие каждому пользователю, вложены внутрь.
например
{
"ID" : 1,
"name" : "John",
"password" : "eek hope this is secure",
"rules": [
{
"ID" : 1,
"Title" : "Rule 1",
"Points" : 100
},
{
"ID" : 2,
"Title" : "Rule 2",
"Points" : 200
}
]
}
Это означает, что вам нужно всего лишь одно чтение, чтобы отозвать пользователя и все его правила.
Хорошей отправной точкой является ссылка Mongodb.org на Design Schema - о чем я говорю выше, это встраивание объектов.