Использование объектно-ориентированной базы данных (db4o) для приложений среднего масштаба
Я наткнулся на базу данных db4o OODB и удивился, как она сравнивается с традиционным стеком с RDBMS или ORM, например, Hibernate/EclipseLink. Приложение представляет собой систему рабочего процесса и со временем будет расширяться. Не уверен, хорошо ли подходит OODB, такой как db4o. Я никогда не работал на OODB, поэтому я не могу сказать. Какие-либо предложения?
1 ответ
Привет! Вот некоторая информация, основанная на моем собственном опыте с DB4O.
В настоящее время существует множество вариантов для так называемых OODB (объектно-ориентированных баз данных). Вместо того, чтобы писать список этих похожих решений, я могу рассказать вам, как это работает, а не использовать обычные СУБД, потому что это был ваш реальный вопрос.
Вы можете прочитать довольно хорошее сравнение некоторых наиболее часто используемых систем в Википедии: Сравнение OODB
Если вы используете постоянную методологию ORM с таким инструментом, как NHibernate, вы упростите себе задачу, связанную с запросами и обновлением базы данных за сохраняемыми объектами. Вы могли бы подумать о таком инструменте, как NHibernate, как о "гибридном" решении, в то время как с чистыми объектными базами данных, подобными той, которую вы упомянули (с которой я немного поработал сам), DB4O от Versant / Actian можно выбрать для работы непосредственно с файлом. в файловой системе или выбрать клиент / сервер своего рода решение. DB4O поддерживает оба.
Наиболее распространенным сценарием, вероятно, будет упомянутый ранее сценарий, в котором вы будете использовать файл в локальной системе для хранения постоянных копий объектов вашего приложения.
DB4O теперь существует как бесплатный продукт для некоммерческого использования и имеет как Java, так и.Net версию. Они оба работают одинаково, и, по моему личному опыту, они работают довольно хорошо для чего угодно, от простых 2-10 мегабайтных баз данных до файлов весом примерно 10-12 ГБ.
Как утверждают разработчики DB4O, если вы ожидаете, что база данных вашего приложения должна быть больше 15-16 Гигабайт, вам следует рассмотреть другие подходы.
DB4O является однопоточным, и для этого требуется довольно быстрое ядро CPU для обработки большого количества транзакций. Но ему удается работать очень хорошо, учитывая это очевидное ограничение.
DB4O легко расширяется и должен покрывать большинство потребностей в объектно-ориентированной базе данных.
Вот короткий пример, который показывает, как легко подключиться и записать серию пользовательских объектов в БД, взятую из одного из моих собственных проектов: (DbPath - строковая константа)
public static void StoreObjectsToDb(IEnumerable<SyncObject> syncObjects)
{
using (IObjectContainer container = Db4oEmbedded.OpenFile(DbPath))
{
try
{
foreach (var hdSyncObject in syncObjects)
{
container.Store(hdSyncObject);
Console.WriteLine("Stored Object with HdID {0}\t<-->\tTfsID {1} to database.",hdSyncObject.HdId,hdSyncObject.HdTfsNo);
}
container.Commit();
LogUtility.WriteToLog("Successfully wrote all objects to database.");
}
catch (Exception ex)
{
container.Rollback();
LogUtility.WriteToLog("Could not save objects to database. Rolling back changes...\nError: {0}",ex.Message);
}
finally
{
container.Close();
}
}
}
Итак, как вы можете видеть, существует довольно простой способ создать новую базу данных и заполнить ее объектами, не требуя какой-либо формы кода сериализации в самих определениях классов.
Во многих OODB есть поддержка многих традиционных функций RDBMS, и в некоторых сценариях накладные расходы на реализацию обычной базы данных SQL намного больше, чем простое встраивание базы данных непосредственно в источник.
Надеюсь, это немного прояснит ситуацию.
Крис
Для более крупных приложений больше подходит Gemstone (постоянный небольшой разговор). Это легко масштабируется до максимального объема оперативной памяти, поддерживаемого одной машиной (2/4 ТБ?). В Gemstone вы обычно не денормализуете, чтобы получить оптимальную производительность.