Как преобразовать форму отношения «многие ко многим» SQL в коллекцию mongoDB? - PullRequest
0 голосов
/ 28 февраля 2012

У меня есть 3 таблицы в SQL, которые имеют отношение «многие ко многим». Первая таблица «account» имеет 3 поля (AccountId, UserName, Email). Вторая таблица «device» имеет 2 поля (DeviceId и DeviceCode) и Таблица «Ассоциация» имеет 4 поля (AccountId, DeviceId, LastActivityDate, HasException)

Как конвертировать их в mongoDB. По предложению mongodb.org я включил коллекцию «Associaton» в коллекцию устройств и учетную запись, но поле «LastAccessDate» всегда обновлялось каждый раз, когда в моей системе появлялась новая транзакция.

-Счетная коллекция: {

«UserName»: «xxx», «Электронная почта»: 1,

«Ассоциация»: [{ «DeviceId»: «4f45c4b73174ec818148d5c5», «LastActivityDate»: «Четверг, 23 февраля 2012 г., 11:44:19 GMT +07: 00», «HasException»: ложь }, { «DeviceId»: ObjectId («4f45c5e93174ec818148d5c7»), «LastActivityDate»: «Четверг, 23 февраля 2012 г., 11:52:05 GMT +07: 00», «Исключение»: ноль }] }

Коллекция устройств: {

"DeviceCode": "abcjxhcbxkjcnxkcjhdiofjdojdlkdknd", «Ассоциации»: [{ "AccountId": "34fdgfdy5676", "LastActivityDate": "03.02.2012", «HasException»: ложь }, { "AccountId": "34fdgfdy5dd676", "LastActivityDate": "03.02.2012", «HasException»: правда }],

}

1 Ответ

2 голосов
/ 28 февраля 2012

Я вижу несколько решений для вашей проблемы:

Редкие обновления

Чтобы избежать объединений, которые должны выполняться на стороне клиента в базах данных NoSQL, соберите все в одну коллекцию.Если вы обновляете не очень часто, вы можете выполнить

{
   _id,
   LastAccessDate,
   HasException,
   Account : {
        AccountID,
        UserName,
        Email },
   Device : {
        DeviceID,
        DeviceCode }
}

. Это приводит к дублированию данных, но если производительность (без объединений) выше эффективности памяти, это, вероятно, подходящее решение для вас.Поскольку данные хранятся несколько раз, обновления более требовательны к серверу.Т.е. обновление адреса электронной почты выглядело бы как

db.myColl.update({"Account.UserName" : "User ToUpdate"}, {"$set" : {"Account.Email" : "new@email.com"} });

Поскольку вам больше не нужны AccountID и DeviceID для присоединения, вы также можете удалить эти два поля.

Частые обновления

Когда у вас частые обновления, вместо встраивания вы можете использовать ссылки.Я думаю, что вы должны решить их на стороне клиента.Тогда у вас есть три коллекции:

Аккаунт:

{
  _id,
  UserName,
  Email
}

Устройство:

{
  _id,
  DeviceCode
}

Ассоциация:

{
  _id,
  account : {
        "$ref" : "Account",
        "$id" : ... }
  device : {
        "$ref" : "Device",
        "$id" : ... }
}

Таким образом, у вас нет дубликатов, но вы должны иметь дело со ссылками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...