Несколько вопросов о работе с db4o
Я пытаюсь db4o object databse, и до сих пор мне очень нравится то, что я вижу, но я также читаю этот пост в stackoverflow db4o experience?, указывая на то, что не все что кажется таким легким легко.
Сейчас у меня есть некоторые вопросы относительно того, как db4o используется в приложениях реального мира. Поэтому, если у вас есть опыт работы (особенно в контексте веб-приложения) с db4o, я бы хотел их услышать.
Вот мои вопросы:
-
Как вы управляете идентификацией объекта при работе с хранимыми объектами db4o? **
Исходя из RDBMS-фона, где у вас обычно всегда есть первичный ключ/столбец идентификатора для каждой таблицы, я не могу сейчас представить, как управлять идентификацией объекта в db4o.
Например, если я работал с NHibernate/mysql и вам нужно было найти объект User по id, я бы сделал session.Load(primaryKey), и он будет извлечен его PK. Также очень часто, что PK определяется как автоматическое увеличение в определении таблицы.
-
Поскольку в db4o такой опции нет, моя мысль заключалась в использовании структуры Guid для идентификации некоторых объектов в базе данных объектов.
-
Любые инструменты для просмотра сохраненных объектов в db?
Есть ли что-то вроде SQL Server Management Studio (возможно, менее сложного) в мире db4o? Я хотел бы просмотреть уже сохраненные данные/объекты в файле db.
-
Привинчиваются ли вы при переименовании объектов домена?
Насколько я знаю, когда вы переименовываете класс, все ранее сохраненные экземпляры в db больше не могут быть восстановлены. Есть ли способ обойти эту проблему? Как вы имеете дело с обновлениями против живой базы данных, которая уже содержит много объектов?
-
Можно ли исключить свойства для сохранения в БД?
Если, например, один объект домена содержит ссылку на объект службы (без состояния), тогда объект службы также будет сохранен, если объект домена будет сохранен, правильно?
Кажется немного странным, что в базе данных хранится служба, по крайней мере для меня.
Можно ли исключить экземпляр службы из хранилища? Если объект домена будет восстановлен снова, как я могу убедиться, что служба снова добавлена в экземпляр?
Ответы
Ответ 1
1) Как управлять идентификацией объекта при работе с хранимыми объектами db4o?
В db4o у вас обычно нет идентификатора. db4o использует идентификатор объекта, чтобы отличить объект друг от друга. Таким образом, один и тот же объект в памяти будет одним и тем же объектом для базы данных.
До тех пор, пока вы не сериализуете объект, это отлично работает. Однако, как только объекты сериализуются/отключены, это больше не работает. Например, в веб-сценарии: вы отправляете данные в браузер. Теперь вам нужно снова идентифицировать объекты с помощью некоторых идентификаторов.
Я думаю, что возможны три варианта:
- Используйте внутренний идентификатор db4o. Однако этот идентификатор не навсегда. Дефрагментация базы данных меняет этот идентификатор.
- Используя db4o UUIDs. Но db4o UUID довольно большие
- Создание идентификаторов самостоятельно
2) Существует инструмент Object-Manager для просмотра базы данных. Однако он крайне ограничен в своем текущем состоянии. По-моему, это огромный недостаток для db4o.
3) Вы можете создать псевдонимы, переименовать классы и поля и т.д.. Однако изменение иерархии наследования не работает. Затем вам нужно скопировать старые данные в новые экземпляры.
4) Да. Вы можете пометить поля как transient с атрибутом .NET-NonSerialized или настраиваемыми атрибутами.
Ответ 2
В объектно-ориентированных базах данных (например, db4o) идентификатор объекта не должен использоваться.
Вместо этого использовались запросы и навигация. Сначала выполните запрос, чтобы получить один/несколько объектов, затем используйте навигацию, чтобы перейти к другим.
"Навигация" означает, что вы просто следуете полям/ссылкам в любом загруженном объекте.
Использование идентификаторов объектов может считаться плохим стилем, большинство приложений (я знаю) не используют их вообще.
Ответ 3
Выполняя некоторую работу с DB4O, я написал простой браузер объектов DB4O, который работает намного лучше, чем включенный. Попробуйте, это с открытым исходным кодом.
http://sourceforge.net/projects/db4oviewer/develop