Вопрос

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

Я понимаю, что Mongo имеет ограничение размера документа 4 МБ, который заставляет меня думать, что у меня должна быть отдельная коллекция для счетов, поскольку они будут накапливаться ежедневно и в конечном итоге могут принять большое количество пространства.

Я просто ищу мнения по этому вопросу. По сути, я буду запрашивать законопроекты пользователя между разными датами (как вы можете себе представить, что система бухгалтерского учета будет делать).

Не то чтобы это действительно важно, но я использую мондоид в проекте Rails3. Я подумал, что сделал что-то вроде:

class User
  references_many :bills
end

class Bill
  referenced_in :user
end

Любые комментарии или предложения дизайна очень ценятся.

Это было полезно?

Решение

1) Что касается лимита документа 4 МБ, это то, что говорит «Монгодб: окончательное руководство»:

Документы превышают 4 МБ (при преобразовании в BSON) не могут быть сохранены в базе данных. Это несколько произвольный предел (и может быть поднят в будущем); Это в основном, чтобы предотвратить плохую конструкцию схемы и обеспечить последовательную производительность. Чтобы увидеть размер BSON (в байтах) документа док, запустить объект. ASSOSIZE (док) из оболочки.

Чтобы дать вам представление о том, сколько 4 МБ, весь текст Война и мир это только 3,14 МБ.

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

2) Оборудовая схема (счета идет с пользовательским документом) - это путь, если вы знаете, что вы никогда не собираетесь запустить глобальные запросы на счетами (пример такого запроса, если вы хотите получить десять самых последних счетов вошел в систему). Вам придется использовать Map-Seind, чтобы получить результаты для таких запросов, если вы используете денормализованную схему.

Нормализованная схема (пользователь и счета в отдельных документах) является лучшим выбором, если вы хотите гибкости в том, как законопроекты запрашиваются. Однако, поскольку Mongodb не поддерживает соединения, вам придется запускать несколько запросов каждый раз, когда вы хотите получить счета, соответствующие пользователю.

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

3) Все обновления в MongoDB являются атомными и сериалами. Это должно ответить на беспокойство Стива.

Вы можете найти эти слайды полезными. http://www.slidehare.net/kbanker/mongodb-meetup.

Вы также можете посмотреть на страницу развертывания производства MongoDB. Вы можете найти слайды SF.NET полезными.

Другие советы

Одним из вопросов, который вы можете рассмотреть, это будет ли когда-нибудь время, где вам нужно будет ссылаться на счета индивидуально, кроме своего членства в пользователю? Если это так, у них будет проще, если у них есть независимое существование.

Помимо этого, выявленная вами выявленная вами размер, - это веская причина разделить их.

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

Прошло долгое время, так как этот вопрос был решен, но я имел дело с чем-то похожим и пожиженным, я бы добавил свои выводы для кого-то еще, что исследую этот вопрос.

Мое понимание заключается в том, что документ 4 МБ был расширен до 16 МБ в версиях 1.8+. Это было из видеопредации Banker, который является одним из членов MongoDB. Я не проверил эту ценность, но беру его слово для этого (так как он, надеюсь, знает, о чем он говорит).

Что касается вопроса о том, что происходит, когда несколько обновлений происходят на одном пользователе с встроенным счетам ... Опять же из того же видео презентации, указанный ответ - это то, что Mongodb обновляет информацию о том, что это обычно не проблема. Экземпл MongoDB заблокирован во время обновления, поэтому несколько обновлений не должны быть проблемой.

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

Лично я обнаружил, что MongoDB (и NoSQL DBS) полезны для конкретных случаев, но этот традиционный SQL / RDMS все еще лучше для большинства вопросов. Если вам кто-то вроде Craigslist, и альтернатива схемы требует вам 2 месяца, чтобы запустить свои архивные данные, то да, Mongodb и NoSQL имеют смысл. Но для подавляющего большинства приложений я не думаю, что это будет серьезная проблема.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top