В моем посте, посвященном моему
выбору технологических основ для моего стартапа,
TruthVine , был один выбор, который я не упомянул. Я не сказал, какую базу данных я выбрал.
Фактически это было решение, которое вообще не принималось во внимание: поработав с RavenDb изнутри и снаружи, это был мой непосредственный выбор. Вот почему
RavenDb остается в стороне
RavenDb похож на официанта в лучшем ресторане. Он обслуживает ваши данные с минимумом суеты и убирается с дороги. В отличие от некоторых технологий персистентности, о которых я могу упомянуть, здесь задействована едва ли какая-либо конфигурация, а не отображение. Вы просто вручаете RavenDb объект или любую форму или размер, и RavenDb сохраняет его. Вы бормочете идентификатор объекта, и RavenDb мгновенно показывает его на вашей тарелке, дочерние коллекции и все такое.
RavenDb — это база данных документов. Это означает, что вам не нужно объявлять схему заранее. Всякий раз, когда вы передаете RavenDb объект, он просто сериализует его в формат JSON и сохраняет его в виде большого двоичного объекта в механизме сохранения. Преимущество, которое я вижу в этом, заключается в том, что при развертывании обновлений в моем коде значительно уменьшается боль, поскольку мне не нужно беспокоиться о сценариях переноса SQL. Я могу добавлять вещи в свои объекты безнаказанно, а для других ситуаций RavenDb имеет очень хорошую поддержку исправления документов .
Как и следовало ожидать, учитывая происхождение RavenDb, клиент RavenDb .Net потрясающий. Он имеет полную поддержку шаблона единицы работы и транзакций . Таким образом, любые сущности, которые вы загружаете в течение сеанса, отслеживаются, и любые объекты, которые изменились при сохранении сеанса, отправляются в базу данных в одной транзакции. Естественно, у клиента RavenDb также есть поддержка LINQ, при этом подкачка запросов особенно тривиальна для реализации.
Вот полный фрагмент, показывающий все, что вам нужно для хранения и извлечения объектов из RavenDb.
class RavenDbDemo { public void Demonstrate() { // DocumentStore is a heavy-weight object usually created once per application var documentStore = new DocumentStore() {Url = "http://myravendbserver.com"}; documentStore.Initialize(); // session objects are light-weight and are created per transaction using (var session = documentStore.OpenSession()) { var person = new Person() { Name = "Samuel Jack", FavouriteDatabase = "Sql Server" }; session.Store(person); session.SaveChanges(); } using (var session = documentStore.OpenSession()) { var person = session.Query<Person>() .First(p => p.Name == "Samuel Jack"); person.FavouriteDatabase = "RavenDb"; session.SaveChanges(); } } public class Person { public int Id { get; set; } public string Name { get; set; } public string FavouriteDatabase { get; set; } } }
Индексирование в основном автоматическое
Одна из особенностей этого фрагмента — потрясающая поддержка индексирования RavenDb. Всякий раз, когда вы делаете новый тип запроса, RavenDb автоматически создает индекс для запроса. В самых последних версиях RavenDb он будет автоматически настраивать индексы с течением времени, в зависимости от шаблонов запросов, которые вы делаете к базе данных. Конечно, вы можете явно определять более сложные индексы, но часто вам это не нужно.
Одна из ситуаций, когда вам нужно будет создавать индексы, — это когда вы хотите воспользоваться поддержкой RavenDb Map / Reduce . Вот как RavenDb поддерживает запросы, которые включают агрегирование нескольких документов, поскольку он не реализует группирующие предложения в запросах LINQ от клиента. Хорошая вещь в том, как это происходит, заключается в том, что индексы Map / Reduce сохраняются, как и другие индексы, что делает агрегированные запросы очень быстрыми.
И еще
В RavenDb есть еще много чего, что мне нравится, но я просто выделю несколько других вещей, которые, я думаю, будут важны для меня как стартапа.
Во-первых, это поддержка репликации RavenDb. Это важно, если вы хотите убедиться, что ваше приложение имеет высокую доступность. Настроить репликацию так же просто, как ввести строку подключения для базы данных, которую вы хотите, чтобы RavenDb также реплицировал. Репликация также очень помогает с масштабируемостью, так как вы можете настроить свои клиенты для чтения из любой реплики, таким образом распределяя нагрузку, но записывая в основную базу данных, таким образом обеспечивая согласованность без возникновения конфликтов.
Далее идет поддержка резервного копирования. RavenDb поставляется со встроенной поддержкой для резервного копирования в Amazon S3 или Amazon Glacier. Вы просто должны сообщить ему, что вы хотите записать, и ваши ключи API, и все готово.
Доступный уровень поддержки всегда является важным фактором при выборе продукта, и RavenDb имеет большую поддержку, как со стороны сообщества RavenDb, которое работает в группе RavenDb , так и со стороны Ayende и остальной части команды Hibernating Rhinos. RavenDb — это проект с открытым исходным кодом (использующий лицензию AGPL, поэтому вы должны купить лицензию, если не хотите открывать свой собственный код), и сообщество очень активно участвует в проекте.
Я должен отметить, что если у RavenDb есть один сбой, документация не так хороша, как могла бы быть. В последнее время ситуация значительно улучшилась, и я понимаю, что несколько книг находятся в процессе разработки. Большую часть времени RavenDb просто работает, но если вы слишком далеко отклонитесь от проторенного пути, вы можете рассчитывать на то, что сообщество поможет вам понять, что происходит. Наличие кода, безусловно, помогает, и, как я уже сказал, сообщество очень отзывчиво.
Наконец, я не могу устоять перед плагином для интерфейса управления (в котором, если вы нажмете на меня, я могу признать, что сыграл свою роль !).
Мне нравится тот факт, что вы сканируете, просматриваете всю свою коллекцию документов или все результаты запроса, когда клиент перемещает данные по мере необходимости.
Полное раскрытие: хотя эти мнения полностью принадлежат мне, и я не верю, что они были ущемлены какими-либо другими факторами, мне предложили лицензию RavenDb от Hibernating Rhinos в обмен на размещение их в этом сообщении в блоге. Я также являюсь независимым спонсором проекта RavenDb.