LiteDB: возможно ли эффективно хранить объекты иерархических классов (C#)? - PullRequest
0 голосов
/ 23 апреля 2020

Я новичок в LiteDB, но мой первый опыт довольно многообещающий. Теперь у меня есть следующая проблема. У меня есть C# классы, которые структурированы следующим образом (упрощенно):

public class Employee
{
    public int      EmployeeId  {get;set;}
    public string   Name        {get;set;}
    public DateTime BirthDate   {get;set;}

    // The parent
    public Company  Company     {get;set;}
}

public class Company
{
    public int              CompanyId   {get;set;}
    public string           Name        {get;set;}

    // The children
    public List<Employee>   Employees   {get;internal set;}
}

, то есть Employee имеет ссылку на компанию, к которой они принадлежат. Я не могу сразу создать коллекцию компаний LiteDB, так как это дает рекурсивную ссылку. Поэтому мне нужно [BsonIgnore] сверх Company в классе Employee:

public class Employee
{
    public int      EmployeeId  {get;set;}
    public string   Name        {get;set;}
    public DateTime BirthDate   {get;set;}

    [BsonIgnore]
    public Company  Company     {get;set;}
}

Очевидно, что нет необходимости иметь дополнительную коллекцию сотрудников, поскольку они уже хранятся в компаниях. Теперь, если я все еще хочу найти индивидуума Employee, скажем, по его идентификатору, мне сначала нужно найти Company, а затем Employee в нем.

Чтобы реализовать его прямым Линком Оператор будет неудобным, особенно если коллекция становится большой, поэтому я ввел коллекцию пар ссылок {EmployeeId, CompanyId}, где ключ EmployeeId. Если я теперь хочу найти сотрудника, я могу сначала найти CompanyId из справочной коллекции, а затем найти сотрудника в нем по EmployeeId.

Это, однако, связано с тем, что мне приходится постоянно управлять коллекцией ссылок (вставка, обновление, удаление). В этом примере это, вероятно, будет управляемо, но мой настоящий проект включает не два иерархических уровня, а четыре, где каждый уровень имеет своих родителей и потомков, поэтому вся система вскоре перестает быть простой.

Есть ли лучшая идея, как эффективно хранить иерархические структуры таких и подобных типов с LiteDB / C#?

...