我如何有效地实现类似SO的喜欢和投票功能?

时间:2010-10-30 07:28:09

标签: asp.net-mvc

我正在使用ASP.NET MVC,SQL Server 2008和Forms身份验证。假设我正在构建像SO这样的问答网站。

以下是我遇到的问题:

用户可以在未登录时查看几乎所有问题,就像在SO上一样。提问问题查询等几乎都是写的。

现在,如果用户已登录,他还应该能够判断他是否已经投票或“收藏”了这个问题,就像在SO上一样。

  1. 我会回去重写我所有的 查询包含userIdInt 即使用户是参数 匿名只是为了知道这一点 信息?
  2. 或者当用户登录时     在,我存储他所投票的所有内容     并始终跟踪这一点     他的会议?
  3. 两者看起来都很麻烦,但1)似乎至少效率更高。谁知道SO如何做到这一点或更有效?

    我认为它不会跟踪用户是否投票,但它似乎确实跟踪用户是否“收藏”了该问题。

1 个答案:

答案 0 :(得分:2)

您可以使用多个接口,一个用于匿名访问,另一个用于经过身份验证的访问,并为每个接口执行不同的查询:

http://en.wikipedia.org/wiki/Interface_segregation_principle

// Just example code - not asp.net-mvc
interface IAnonymousReader
{
    IEnumerable<Answer> GetAnswers(int page, int countPerPage);
}

interface IAuthenticatedReader
{
    IEnumerable<AuthenticatedAnswer> GetAnswers(int page, int countPerPage,
        int userId);
    // An alternative here is to get userId from concrete class, and pass in ctor
}

这需要您编写多个查询,或者您要获取刚刚丢弃的数据。您可以通过以编程方式构建查询来避免代码重复。您可以通过使用ORM来避免编写查询。

对于数据,您可以规范化数据,以便投票信息位于单独的表中,但仍然绑定到答案。当您对匿名用户进行查询时,只需不要加入/查询该表。