Какие базы данных NoSQL, если таковые имеются, могут предоставлять поток * изменений * в набор результатов запроса?
Какие базы данных NoSQL, если таковые имеются, могут предоставлять поток изменений в набор результатов запроса?
Может ли кто-нибудь указать мне на некоторые примеры?
Во-первых, я считаю, что ни одна из баз данных SQL не предоставляет эту функциональность - я прав?
Мне нужно указать произвольные простые запросы, чей эквивалент в SQL может быть записан:
SELECT * FROM accounts WHERE balance < 0 and balance > -1000;
Мне нужен начальный набор результатов:
id: 100, name: Fred, balance: -10
id: 103, name: Mary, balance: -200
но затем я хочу, чтобы поток изменений выполнялся навсегда, пока я не остановил их:
meta: remove, id: 100
meta: add, id: 104, name: Alice, balance: -300
meta: remove, id: 103
meta: modify, id: 104, name: Alice, balance: -400
meta: modify, id: 104, name: Alison, balance: -400
meta: add, id: 101, name: Clive, balance: -200
meta: modify, id: 104, name: Alison, balance: -100
...
Примечание. Я не говорю о потоковой передаче больших наборов результатов. Я ищу поток изменений в режиме реального времени.
Кроме того, он должен масштабироваться, если это возможно.
Спасибо,
Крис.
Ответы
Ответ 1
Хотя ответ был принят, есть еще один ответ, который доходит до сути предположений под вашим вопросом.
Что такое бизнес-проблема, связанная с получением списка изменений данных? Что делать, если вместо простого получения списка изменений в данных вы получили набор событий, которые рассказывали вам, почему и как изменились данные.
Эта концепция является одной из основных причин, лежащих в основе "CQRS" как архитектуры. В основном вы сохраняете все события, вызвавшие изменение ваших данных, например. FundsDeposited, FundsWithdrawn и т.д., И вы получаете возможность "переигрывать" эти события и обнаруживать не только то, как ваши данные менялись со временем, но почему.
Как только вы спуститесь по этой дороге, вы получите возможность хранить события как поток, и вы больше не ограничены небольшой горсткой хранилищ. Вместо этого вы могли бы буквально использовать любой механизм хранения, и это выполнило бы работу.
Ответ 2
У CouchDB есть фид изменений. В основном это цепочка блоков или история каждого изменения в базе данных с момента ее создания. Вы можете получить канал через JSON, JSONP, длительный опрос или как непрерывный поток и написать приложения, которые отвечают на изменения в базе данных.
Здесь меняются фиды из моего блога
Чтобы узнать больше, этот раздел руководства CouchDB
Ответ 3
Не уверен, что это именно то, что вы ищете, но считали, что это возможно достаточно, чтобы гарантировать упоминание!
Если вы используете репликацию в MongoDB, все операции записи сохраняются в oplog (журнал операций). Поэтому каждая вставка/обновление/удаление записывается там, чтобы их можно было воспроизвести на вторичных узлах. Это ограниченная коллекция, поэтому циклически циклируется и перезаписывается (вы можете установить ее размер). Но теоретически этот oplog можно использовать как способ получить поток изменений - я сам не пробовал, но, возможно, вы могли опросить этот oplog.
Ответ 4
Только мозговой штурм:
Возьмем, к примеру, MongoDB И не хотим получать доступ к фиду изменений, как описано выше. Да, это звучит дрянной по сравнению с другими ответами, но это была моя первая идея, прежде чем эти ответы появились во время написания...
Текущие функции, связанные с этим вопросом, - это Capped Collections (http://www.mongodb.org/display/DOCS/Capped+Collections) и, возможно, выполнение кода на стороне сервера (http://www.mongodb.org/display/DOCS/Server-side+Code+Execution).
С закрытыми коллекциями было бы легче писать много данных, но читать меньше (например, файлы журналов) - этот тип коллекции создается для таких случаев.
серверные скрипты можно использовать для аутсорсинга большого количества обработки (меньше кода приложения), но вы можете оставить эту точку, если хотите полностью интегрировать логику в своем приложении.
Не знаю, есть ли в NoSQL DB с "hooks". Я знаю, что это возможно в postgres (SQL).
В настоящее время логика потоковой передачи должна быть реализована в коде приложения AFAIK.
В CouchDB это возможно с помощью "Представлений", которые не реализованы в MongoDB (если это неверно, сообщите мне ссылку, это тоже интересная тема!).
Не знаю, полезно ли это. Это моя первая попытка ответить здесь на SO.
Ответ 5
этот тип вещей должен выполняться в приложении, а не в базе данных.
Значение, каждый раз, когда вы вносите изменения, он должен записываться как новая запись. Не внесение изменений в запись.
В вашем приложении вы можете добавить больше интеллекта, если вы сделаете это так.
Ответ 6
Начиная с версии 3..6, MongoDB использует Изменить потоки, чтобы приложения могли подписаться на список изменений в реальном времени:
Изменить потоки позволяют приложениям получать доступ к изменениям данных в реальном времени без сложностей и риска хвоста в oplog. Приложения могут использовать потоки изменений для подписки на все изменения данных в коллекции и немедленно реагировать на них.
Изменение потоков может принести пользу архитектуре с зависимыми бизнес-системами, информируя о нижестоящих системах, как только изменения данных будут долговечны. Например, потоки изменений могут сэкономить время для разработчиков при реализации сервисов Extract, Transform и Load (ETL), межплатформенной синхронизации, функциональности совместной работы и служб уведомлений.
По умолчанию поток возвращает изменения ко всем документам в коллекции, но вы можете добавить конвейер агрегирования для фильтрации только документов, которые соответствуют вашему набору результатов запроса.
Ответ 7
Если получение всех изменений (не только изменений в наборе результатов запроса) является accepteble, тогда вы можете создать ведомость репликации mongodb и получить все изменения от master. Я видел ведомое устройство репликации mongodb, написанное даже в php, поэтому его не должно быть слишком сложно реализовать.
Ответ 8
mongoDB реализует tailable-cursor, но только для ограниченных коллекций. См. docs. Он может быть полезен в зависимости от ваших конкретных требований.