C# NHibernate需要非常快速的收集访问

C# NHibernate需要非常快速的收集访问,c#,performance,nhibernate,C#,Performance,Nhibernate,我有一个主用户表,当通过NHibernate映射时,它会构造一个包含完整用户详细信息的关联数据的大层次结构,我很少需要这些信息,所以不要总是加载这些信息。我有一个名为UserLight的部分表,它只包含非常基本的信息,没有层次连接或集合,因为很多时候我需要快速访问基本信息 但我的问题是,除了这些,这只是背景 我的网站涉及从大型用户群中搜索其他用户,我希望提供从搜索中删除用户的功能,即单击用户配置文件上的X,它会将用户添加到删除列表中,而这些删除列表将不会在以后的搜索中出现 我创建了一个单独的表和

我有一个主用户表,当通过NHibernate映射时,它会构造一个包含完整用户详细信息的关联数据的大层次结构,我很少需要这些信息,所以不要总是加载这些信息。我有一个名为UserLight的部分表,它只包含非常基本的信息,没有层次连接或集合,因为很多时候我需要快速访问基本信息

但我的问题是,除了这些,这只是背景

我的网站涉及从大型用户群中搜索其他用户,我希望提供从搜索中删除用户的功能,即单击用户配置文件上的X,它会将用户添加到删除列表中,而这些删除列表将不会在以后的搜索中出现

我创建了一个单独的表和对象映射,名为usersearchremovation,其中只有UserId、RemovedId作为数据列

我正试图从代码中找出处理此问题的最佳方法,因为我希望响应度高。我认为最好的GUI方式是在web端调用Ajax查询,该查询调用web服务,传入两个用户id,然后在数据库级别执行工作

我不确定的是,在DB级别执行此操作的最佳方法。在一个基本的层面上,我可以检查一下搜索删除是否已经存在(需要时间),如果不存在,就添加它,或者我可以在没有检查和风险重复的情况下添加它,我想这不是一个问题,只是不是最干净的解决方案。因此,仅仅添加它似乎是最快的方法

是否有其他方法可以做到这一点,即维护一个会话级别的用户删除列表,然后将其添加到该列表中,剩下的由NHibernate完成?对我来说,在会话级别保存数据负载听起来很糟糕,而在内存中更新集合并将其传输到db对象的工作听起来比只向db添加一行要慢得多

有谁能想出更好的解决办法吗


谢谢

答案取决于用户数据库的相对大小、平均搜索结果和平均阻止列表。 这还取决于阻止规则将来可能不会变得更复杂的方式,从而确保在DB级别包含它们是安全的


假设您的用户数据库为50万用户,平均搜索结果为500,平均阻止列表为100,并且规则可能会演变,我会选择基于词典的搜索后应用程序级筛选。

当您说“从搜索中删除用户”时,您的意思是,一旦用户从搜索中删除,如果再次执行此搜索,用户将不会出现,或者删除是否仅在搜索时有效(+可能是分页或排序)?您能否提供有关映射的一些信息?
usersearchremove
是否映射到了
User
上的实体或集合属性?目前usersearchremove是一个独立实体,除了session.Query()之外,无法检索它。其中(u=>u.UserId==UserId)。我曾考虑将它作为一个用户集合,但由于它在时间上可能是一个非常大的表,每次你想收回UserDetails时,它都会进行连接,大大降低速度,所以我将它分开。此外,搜索功能是网站的主要功能,也是最需要性能的部分,因此我将其分开,以优化一个使用案例Skyp-请参见下文,了解其工作原理。一旦你删除它们,只要你是该网站的成员,它们就不会再出现在你的搜索中。如果你犯了一个错误,你将能够查看你删除的列表并重新添加用户到搜索中,但这几乎不会被使用。想象一下,一个约会网站,一旦你决定对某人不感兴趣,你点击一个X,他们就再也不会在你的搜索中出现,这样你的搜索就更容易找到你还没有评估过的新用户。该网站需要处理的用户量可能在50万到100万之间,根据用户的操作方式,每个用户在阻止列表中可能有0-5000个用户。它的工作方式是,一旦用户从您的搜索中删除,他们将不会出现在本次或任何未来的搜索中,因此他们将从您的搜索中永久删除。我甚至还没有考虑过实际的搜索,我假设我只计算搜索结果集,分别加载阻止列表并过滤原始结果,然后再返回给用户。@user1122909对于5000个用户,执行搜索后过滤可能不是最有效和可扩展的解决方案。无论如何,您必须检查阻塞表索引blockingUserId/blockedUserId(按此确切顺序)中是否为聚集索引。对于这些卷,您是否有关于更高效和可扩展解决方案的建议?也使其成为聚集索引。。。。由于峰值可能有20亿行,向搜索结果中添加一个用户将导致整个表的重新物理排序!当然,这将是一个打破网站性能的冲击吗?@ USER 1122909我想索引调整问题将通过调整填充因子来解决(虽然我从来没有考虑20亿行)看起来你的问题会得到更好的答案。