Несоответствие импеданса db4o - PullRequest
1 голос
/ 14 марта 2011

Я создал хороший слой хранилища вокруг базы данных db4o для хранения Product объектов, которые относятся к Manufacturer объектам в отношении один-ко-многим, то есть:

public class Manufacturer
{
    public string Name { get; set; }
}

public class Product // simplified
{
    public string Name { get; set; }
    Manufacturer Manufacturer { get; set; }
}

Итакдалеко мне очень нравится db4o.Проблема, которую я имею, заключается в предотвращении дублирования данных без обращения к идентификаторам.

При реализации ссылок, таких как производители, использующих SQL Server, мои модели данных будут содержать уникальное поле идентификатора, и, в свою очередь, мой класс Product будет загрязненс ManufacturerID .Я предполагал, что использование объектной базы данных, такой как db4o, уменьшит несоответствие импеданса между реляционной БД и объектами, но без идентификаторов невозможно отличить один объект от другого при его редактировании.

Существует ли элегантный способразделить производителя между продуктами без дублирования данных?Или мне просто использовать реляционную БД?

Ответы [ 3 ]

1 голос
/ 15 марта 2011

Вы можете добавить уникальный индекс для db4o в вашей конфигурации.

configuration.Common.ObjectClass(typeof (Manufacturer)).ObjectField("<Name>k__BackingField").Indexed(true);
configuration.Add(new UniqueFieldValueConstraint(typeof(Manufacturer), "<Name>k__BackingField"));

Таким образом, невозможно иметь два разных объекта-производителя с одинаковым именем в вашей базе данных. Имя поля должно быть «k__BackingField», потому что вы используете авто свойства. Конечно, вы можете добавить целочисленный идентификатор и индексировать его таким же образом.

1 голос
/ 15 марта 2011

Основные вещи в первую очередь. db4o управляет объектами с помощью их идентификатора объекта . Когда вы снова сохраните тот же экземпляр объекта, db4o обновит этот объект в базе данных. То же самое относится и к ссылкам. Когда два разных объекта ссылаются на один и тот же объект, они фактически ссылаются на один и тот же объект в базе данных. В вашем примере: когда два разных продукта ссылаются на один и тот же экземпляр производителя, они также ссылаются на одного и того же производителя в базе данных. Это достигается наличием таблицы на заднем плане, которая отслеживает объекты .

Теперь у этого подхода есть проблемы. Как только вы сериализуете объекты (веб-приложение, веб-сервисы и т. Д.) Или закрываете объект-контейнер, db4o забывает, какой объект в памяти принадлежит какому объекту. Тогда он больше не распознает существующий объект и просто сохраняет его как новый объект. Это означает, что вы никогда не должны загружать и хранить объект с другим экземпляром контейнера объекта. И что вам, вероятно, нужны идентификаторы для распознавания объектов . Например, чтобы распознать объект через веб-запросы. Простое решение - использовать Guids, чтобы присвоить объекту уникальный идентификатор.

Вернуться к вашему вопросу. Чтобы разделить производителя между продуктами, вы просто указываете его на одного и того же производителя. Как это:

Product newShinyProduct = new Product(); // the new thing
// Get a existing product or manufacturerer, doesn't matter
Product oldProduct = (from p in container.AsQueryable<Product>()
                     where p.Name == "Get a product"
                     select p).First();

// now just assigne the existing manufacturer to the new product
// this product will now refer to the same manufacturer
// and db4o will store this that way. The manufacturer isn't doublicated.
newShinyProduct.Manufacturer = oldProduct.Manufacturer;
// store the new product in the database.
container.Store(newShinyProduct);
0 голосов
/ 28 сентября 2012

db4o поддерживает уникальный внутренний идентификатор для каждого сохраненного объекта.

проверьте эти ссылки: http://community.versant.com/documentation/reference/db4o-8.1/java/reference/Content/basics/identity_concept.htm

http://community.versant.com/documentation/reference/db4o-8.1/java/reference/Content/platform_specific_issues/disconnected_objects/comparison_of_ids.htm

...