Разработка класса для приложения медиа-менеджера, использующего Db4o для эффективного запроса

Я начинающий программист и мне нужна помощь с дизайном класса для моего приложения.

Мы работаем над дизайном настольного приложения медиа-менеджера (используя.NET Framework 4.0). Приложение управляет хранилищем мультимедиа на локальном жестком диске (аналогично XBMC http://xbmc.org/).

Пользователь может получить метаданные (информацию о конкретном фильме, актерах и т. Д.) С нашего собственного сервера, который, в свою очередь, должен получить метаданные из одного или нескольких источников. Пользователи могут затем связать локальные мультимедийные файлы с этими концептуальными объектами (файл bigbuckbunny.avi может быть связан с фильмом Big Bucks Bunny.)

Сервер и клиент будут общаться с помощью WCF (эта деталь, вероятно, не очень актуальна)

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

Например, она могла бы искать [фильм, в котором есть [жанры боевик и комедия ] и [звезды Тома Круза ]].

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

Мы хотим использовать db4o (или, возможно, какую-то другую OODBMS для хранения данных как на сервере, так и на клиенте). Мы надеемся, что сможем выполнять все запросы только через LINQ (без QBE или SODA).

Теперь реальный вопрос. Как мы проектируем классы, чтобы они могли эффективно запрашиваться.

Дизайн, о котором мы изначально думали, был таким:

class Artist
{
    String Name;
    .
    .
    .
}

class CrewMemberRole
{
    Artist a;
    String roleType;
    String characterName;
}

class Movie
{
    String title;
    List<CrewMemberRole> Crew;
}

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

Мы могли бы предложить два возможных решения:

  1. Используйте идентификаторы (возможно, бросают вызов цели использования OODBMS) и связывайте каждого художника со всеми фильмами, в которых он работал.

  2. То же, что и выше, но используйте ссылки на объекты вместо идентификаторов.

Ни то, ни другое не кажется отличным решением.

Что нам делать? Даже частичные решения или ссылки на соответствующие внешние ресурсы будут оценены.

1 ответ

В ответ на этот комментарий: "Спасибо за ваш ответ. Учитывая скелеты классов, которые я включил, не могли бы вы написать пример запроса LINQ, где все фильмы от конкретного исполнителя могут быть получены из объекта-объекта db-контейнера".

Во-первых, сохраните несколько фильмов в db4o, чтобы у нас было что работать:

    private static void SaveMovies()
    {
        Artist chevyChase = new Artist() { Name = "Chevy Chase" };
        Artist kevinBacon = new Artist() { Name = "Kevin Bacon" };

        CrewMemberRole roleFletch   = new CrewMemberRole() { Artist = chevyChase, CharacterName = "Fletch", RoleType = "Main" };
        CrewMemberRole roleVacation = new CrewMemberRole() { Artist = chevyChase, CharacterName = "Clark", RoleType = "Main" };
        CrewMemberRole roleFootloose = new CrewMemberRole() { Artist = kevinBacon, CharacterName = "Ren", RoleType = "Main" };

        Movie fletchMovie    = new Movie() { Title = "Fletch" };
        fletchMovie.CrewMemberRoles.Add(roleFletch);

        Movie vacationMovie  = new Movie() { Title = "National Lampoons Vacation" };
        vacationMovie.CrewMemberRoles.Add(roleVacation);

        Movie footlooseMovie = new Movie() { Title = "Footloose" };
        footlooseMovie.CrewMemberRoles.Add(roleFootloose);

        IObjectContainer db = GetDatabase();

        db.Store(fletchMovie);
        db.Store(vacationMovie);
        db.Store(footlooseMovie);

        db.Close();
    }

Затем отобразите их по исполнителю:

    private static void DisplayMoviesByArtist()
    {
        IObjectContainer db = GetDatabase();

        IEnumerable<Movie> movies = from Movie movie in db
                                    where movie.CrewMemberRoles.Exists(role => role.Artist.Name == "Chevy Chase")
                                    select movie;

        foreach (Movie movie in movies)
        {
            Console.WriteLine(movie.Title);
        }

        db.Close();
    }

Вот метод GetDatabase():

private static IObjectContainer GetDatabase()
{
    return Db4oClientServer.OpenClient("DellXps", 8484, "user", "password");
} 

введите описание изображения здесь

Другие вопросы по тегам