Исходя из реляционной базы данных, как мне моделировать отношения в db4o (или любой объектной базе данных)? - PullRequest
2 голосов
/ 10 августа 2010

Я экспериментирую с db4o в качестве хранилища данных, поэтому, чтобы разобраться с ним, я подумал, что мне нужно создать простое веб-приложение для отслеживания проблем (в ASP.NET MVC).Я обнаружил, что db4o отлично подходит для быстрой разработки, особенно для небольших приложений, подобных этому, и это также устраняет необходимость в ORM.

Однако, исходя из фона SQL Server / MySQL, я 'Я немного не уверен, как мне следует структурировать свои объекты, когда дело доходит до отношений (или, возможно, я просто не совсем понимаю, как работают базы данных объектов).

Вот мой простой пример: у меня всего две моделиклассы, проблема и персона.

public class Issue
{
    public string ID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime? SubmittedOn { get; set; }
    public DateTime? ResolvedOn { get; set; }
    public Person AssignedBy { get; set; }
    public Person AssignedTo { get; set; }
}

public class Person
{
    public string ID { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}

Свойства ID - это просто строки GUID, сгенерированные помощником .NET Guid.NewGuid().

Итак, вот как я изначально думал, что приложение будет работать;пожалуйста, игнорируйте любые проблемы безопасности и т. д. и предположим, что у нас уже есть несколько Person объектов, хранящихся в базе данных:

  1. Пользователь входит в систему. Запросите базу данных для Person, которая соответствует имени пользователя и паролю,и сохранить его / ее идентификатор GUID в качестве переменной сеанса.Перенаправить на главный экран приложения.
  2. Зарегистрированный пользователь создает новую заявку на выдачу, выбирая пользователя, которому необходимо назначить его, из раскрывающегося списка.Они заполняют другие данные (название, описание и т. Д.), А затем отправляют форму.
  3. Запрос объектов Person в базе данных (по их идентификаторам GUID), чтобы получить объект, представляющий вошедшего в систему пользователя иодин, представляющий пользователя, которому был назначен билет.Создайте новый объект Person (заполненный опубликованными данными формы), назначьте объекты Person свойствам Issue AssignedBy и AssignedTo объекта и сохраните его.

Это будет означать, что у меня есть два Person объекта, сохраненных против каждой Issue записи.Но что произойдет, если я обновлю исходный Person - все ли сохраненные ссылки на этот Person в различных объектах выпуска обновятся, или мне придется обрабатывать это вручную? Являются ли ссылками или копиями?

Было бы лучше / эффективнее просто хранить строку GUID для полей AssignedBy и AssignedTo (как показано ниже), а затем искать исходную персону на основеоб этом каждый раз?

public class Issue
{
    public string ID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime? SubmittedOn { get; set; }
    public DateTime? ResolvedOn { get; set; }
    public string AssignedByID { get; set; }
    public string AssignedToID { get; set; }
}

Я думаю, что я просто застрял в определенном образе мышления, который смущает меня.Если бы кто-то мог объяснить это ясно, это было бы очень полезно!

Ответы [ 2 ]

2 голосов
/ 11 августа 2010

Объектные базы данных пытаются обеспечить ту же семантику, что и объекты в памяти. Практическое правило: это работает как объекты в памяти. Объектные базы данных хранят ссылки между объектами в базе данных. Когда вы обновляете объект, этот объект обновляется. И если у вас есть ссылка на эти объекты, вы увидите измененную версию.

В вашем случае объекты Issue ссылаются на объект person. Когда вы обновляете этого человека, все проблемы, которые к нему относятся, «видят» это обновление.

Конечно, примитивные типы, такие как int, строки, long и т. Д. Обрабатываются как объекты-значения, а не как ссылочные объекты. Также массивы обрабатываются как объекты-значения в db4o, это означает, что массив хранится вместе с объектом, а не как ссылка. Все остальное хранится в качестве справочного материала, даже такие коллекции, как список или словари.

1 голос
/ 12 августа 2010
...