如何有效地实现类似 SO 的收藏和投票功能?

Posted

技术标签:

【中文标题】如何有效地实现类似 SO 的收藏和投票功能?【英文标题】:how do I efficiently implement SO-like favorite and voting feature? 【发布时间】:2010-10-30 07:28:08 【问题描述】:

我正在使用 ASP.NET MVC、SQL Server 2008 和表单身份验证。假设我正在构建一个类似 SO 的问答网站。

这是我遇到的问题:

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

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

    我要回去重写我所有的 包含 userIdInt 的查询 即使用户是参数 匿名只是为了知道这个 信息? 或者当用户登录时 在,我存储他投票的所有内容 并全程跟踪 他的会议?

两者看起来都很麻烦,但 1) 至少看起来更有效。有人知道 SO 是如何做到这一点或更有效的方式吗?

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

【问题讨论】:

【参考方案1】:

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

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 来编写查询。

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

【讨论】:

是的,数据已标准化。但是,基本上你要我写两个版本的 fetch 查询。我必须使用界面吗? @progtick:不,您不必使用接口。对相同的基础数据进行多次表示被认为是一个强大的设计原则。无论是类、抽象类、接口、webservice接口等,都是实现细节。为什么厌恶多个查询?代码(或代码重复)真的那么大吗?如果您真的无法忍受代码重复(例如,以编程方式构造查询字符串),您可以使用一些技术,并且您可以通过使用 ORM 层来避免自己编写查询。 这就像我有 7-8 个查询来获取问题,现在我必须回去再写 7-8 个查询.. 但我想没关系 @progtick:这些查询中有多少需要更改,有多少是相同的?您可以将这些查询的字符串放在一个公共区域中,因此您只需编写一次重复的查询。如果大字符串存在重复部分,则可以拆分字符串并将它们连接在一起,或者如果查询是嵌套的,则构建函数以将一个查询字符串与外部查询包装起来。 @progtick:如果问题真的是如何避免重复查询,您可以在问题中放置一些(精简,修改以免暴露您的私人数据)版本的查询,所以我们可以帮助您解决那个问题。或者你可以提出第二个问题。

以上是关于如何有效地实现类似 SO 的收藏和投票功能?的主要内容,如果未能解决你的问题,请参考以下文章

android 百度地图如何实现类似滴滴打车的功能,比如可以获取自己定位和车辆移动轨迹。

(java web开发)我想做一个投票系统,需要实现到达指定时间,该投票关闭的功能。 比如,投票A

如何编写一个投票功能的智能合约

如何编写一个投票功能的智能合约

如何编写一个投票功能的智能合约

为许多类似功能实现多次调度的有效方法