Разработка класса для приложения медиа-менеджера, использующего 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, проходить по каждому члену списка и определять, присутствует ли конкретный художник в этом списке., Это приемлемо? Я сомневаюсь.
Мы могли бы предложить два возможных решения:
Используйте идентификаторы (возможно, бросают вызов цели использования OODBMS) и связывайте каждого художника со всеми фильмами, в которых он работал.
То же, что и выше, но используйте ссылки на объекты вместо идентификаторов.
Ни то, ни другое не кажется отличным решением.
Что нам делать? Даже частичные решения или ссылки на соответствующие внешние ресурсы будут оценены.
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");
}