2011-12-25 22 views
1

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

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

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

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

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

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

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

Мы хотим использовать db4o (или, возможно, некоторые другие ООСУБД для хранения данных на сервере и на клиенте) Мы надеемся, чтобы быть в состоянии выполнить все запросы только через LINQ (без QBE или SODA)

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

дизайн мы первоначально думали только о том, как это:

class Artist 
{ 
    String Name; 
    . 
    . 
    . 
} 

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

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

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

Есть два возможных решения, которые мы могли бы придумать:

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

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

Не похоже, что это отличное решение.

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

+0

Я не думаю, что вы хотите «дизайн классов, чтобы они могли быть эффективны опрошены.» Я думаю, что вы хотите создавать свои классы так, что они представляют собой правильную модель предметной области. И что касается повторения всей коллекции объектов Movie ... зачем вам это нужно? Если вы используете запрос linq, то вы не получаете все объекты и итерации через каждый. По крайней мере, этого не должно быть. –

+0

Благодарим за отзыв. Учитывая классы скелетов, которые я включил, не могли бы вы написать пример запроса LINQ, где все фильмы от конкретного исполнителя могут быть получены из объекта объекта db объектов. –

+0

Перейдите с помощью опции 2, используя ссылки на объекты, db4o будет обрабатывать это изящно по своим запросам быстро, используя ссылки на объекты. – German

ответ

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"); 
} 

enter image description here

+0

Благодарим вас за то, что вы нашли время, чтобы написать ответ. Я должен оценить тот факт, что вы написали полный код с выходом. У меня есть вопрос, хотя. Разве эта реализация по-прежнему не требует итерации (а не вручную, но внутри, когда выполняется запрос LINQ) через ВСЕ фильмы и все исполнители в каждой команде за фильм? Я ответил +1, но я все еще надеюсь найти новую перспективу в дизайне класса. Спасибо, еще раз –