我目前正在处理一个相当大的基于问题/答案的应用程序(有点像 stackoverflow / answerbag.com) 我们使用 SQL (Azure) 和 nHibernate 进行数据访问,使用 MVC 进行 UI 应用程序。
到目前为止,在我们有一个Post表(包含问题/答案)的意义上,该模式大致沿着 stackoverflow db 的路线
可能会使用以下存储库接口的内容:
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 db 仅用作持久存储——上述 IQueryable 操作的大部分将移至某种 SolrFinder 类(或类似的类)
Body 属性是当前导致问题的一个 - 它相当大,并且会减慢 sql 的查询速度。
我的主要问题是,例如,如果有人“更新”了一篇文章——例如添加了一个新标签,那么整个文章都需要重新索引。显然,这样做需要这样的查询:
“SELECT * FROM POST WHERE ID = xyz”
这当然会非常缓慢。Solrnet 有一个 nHibernate 设施 - 但我相信这将与上述结果相同?
我想了一个办法来解决这个问题,我想听听你的看法:
- 将 ID 添加到队列(amazon sqs 或其他东西 - 我喜欢它的易用性)
- 在某处有一个服务(或一堆服务)来执行上述查询、构建文档并将其重新添加到 solr。
我的设计遇到的另一个问题: 应该从哪里调用“重新索引”方法?MVC 控制器?还是我应该有一个“PostService”类型的类来包装 IPostRepository 的实例?
任何指针都非常受欢迎!