设计类似于 Stack Overflow 的基于点数的权限系统时需要考虑哪些架构最佳实践?

4
Stack Overflow有一个基于积分的权限系统,该系统决定了网站上许多事情,例如您可以编辑什么以及向系统添加新标签的能力。
具体来说,在架构实现方面,您会给那些设计这样的系统的人什么建议?权限存储在哪里?如何使用这些权限来确定视图中出现的可编辑字段?是否有任何好的开源代码示例可供研究?
关于拥有或共享问题或文档等对象模型,将所有者的引用存储在该对象的模型中与在帐户模型中存储对该对象的引用有什么优缺点?例如。
document = { id:          21234,
             owner_id:    4d3ca9f1c067,
             shared_with: [a50d1e000138, 4d3ca9f1c067a, 50d1e000138] }

对比。

user = { id:              4d3ca9f1c067,
         documents_owned: [21234, 31452, 12312],
         collaborates_on: [23432, 43642, 12314, 23453] }

我也在 Quora 上提出了这个问题:http://www.quora.com/What-are-some-architectural-best-practices-to-consider-when-designing-a-point-based-permissions-system-like-StackOverflow-uses - Andrew De Andrade
1个回答

1

将权限存储在单独的模型中,作为权限所需点对。

在视图中,参考上述权限模型确定已登录用户是否具有足够的每个项目的权限以显示。

模型选项:我更喜欢前者,因为(1)它具有更简单、扁平的结构,因此在列出问题时不需要通过用户表进行嵌套循环,以及(2)删除文档不会涉及更新用户对象。(除非他们的分数在删除文档时下降或类似情况。)


如果您正在使用Javascript,您可以使用underscore.js来简化您提到的嵌套循环问题。以下是一个账户模型的示例函数:ownsOrCollaborates: function (model) { return _.include(model.get("owners"), this.id) || _.include(model.get("collaborators"), this.id) } - Andrew De Andrade
@Andrew:我不熟悉underscore.js。我熟悉函数式编程,所以我知道嵌套循环可以很容易地表达,但单个循环在概念上仍然更简单 :) - Fred Foo
我同意。如果你有任何JS相关工作,检查一下underscore.js是值得的。 - Andrew De Andrade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接