В настоящее время я работаю над достаточно большим приложением на основе вопросов / ответов (вроде stackoverflow / answerbag.com) Мы используем SQL (Azure) и nHibernate для доступа к данным и MVC для приложения пользовательского интерфейса.
Пока что схема примерно аналогична stackoverflow db в том смысле, что у нас есть один Post таблица (содержит оба вопроса / ответа)
Вероятно, я собираюсь использовать что-то вроде следующего интерфейса репозитория:
public interface IPostRepository
{
void PutPost(Post post);
void PutPosts(IEnumerable<Post> posts);
void ChangePostStatus(string postID, PostStatus status);
void DeleteArtefact(string postId, string artefactKey);
void AddArtefact(string postId, string artefactKey);
void AddTag(string postId, string tagValue);
void RemoveTag(string postId, string tagValue);
void MarkPostAsAccepted(string id);
void UnmarkPostAsAccepted(string id);
IQueryable<Post> FindAll();
IQueryable<Post> FindPostsByStatus(PostStatus postStatus);
IQueryable<Post> FindPostsByPostType(PostType postType);
IQueryable<Post> FindPostsByStatusAndPostType(PostStatus postStatus, PostType postType);
IQueryable<Post> FindPostsByNumberOfReplies(int numberOfReplies);
IQueryable<Post> FindPostsByTag(string tag);
}
Мой вопрос: Куда и как мне вписать в это solr, чтобы лучше запрашивать эти "сообщения" (Я буду использовать solrnet для фактического взаимодействия с Solr)
В идеале, я бы использовал базу данных SQL как просто постоянное хранилище - Большая часть вышеупомянутых операций IQueryable переместится в какой-то класс SolrFinder (или что-то в этом роде)
Свойство Body вызывает проблемы в настоящее время - оно довольно велико и замедляет запросы на sql.
Моя основная проблема, например, заключается в том, что если кто-то «обновляет» сообщение - например, добавляет новый тег, тогда весь этот пост потребуется переиндексировать. Очевидно, что для этого потребуется следующий запрос:
«SELECT * FROM POST WHERE ID = xyz»
Это, конечно, будет очень медленным. В Solrnet есть средство nHibernate, но я считаю, что это будет тот же результат, что и выше?
Я придумал способ обойти это, и мне бы хотелось, чтобы ваше мнение о нем:
Другая проблема I с моим дизайном: Откуда следует вызывать метод (ы) "переиндексации"? Контроллер MVC? или я должен иметь класс типа "PostService", который является оболочкой для экземпляра IPostRepository?
Любые указатели принимаются на этот счет!