- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我必须为一个非常大的网站想出一个成员(member)解决方案。该站点将使用 ASP.NET MVC 2 和 MS SQL2008 数据库构建。
当前的成员(member)提供程序似乎有点矫枉过正,功能太多了。
我只想存储电子邮件/密码和基本个人资料信息,例如名字/姓氏、电话号码。我将只需要 2 个角色,管理员和用户。
考虑到可能有数百万用户注册,您对这种情况有何建议? StackOverflow 使用什么?
我过去经常使用现有的 Membership API,并将其扩展为存储附加信息等。但是有一些表格,例如
aspnet_Applications
aspnet_Paths
aspnet_SchemaVersions
aspnet_WebEvent_Events
aspnet_PersonalizationAllUsers
aspnet_PersonalizationPerUser
这是非常多余的,我从来没有找到用处。
编辑
只是为了澄清@drachenstern 回答后的一些其他冗余,在 Membership/Users 表中还有一些我没有用到的额外列,但它们会添加到每个 select/insert 语句的负载中。
此外,我听说 GUID 并不是那么快,我更愿意使用整数来代替(就像 Facebook 那样),这也会被公开。
我如何着手创建自己的Membership Provider,重新使用一些 Membership APIs(验证、密码加密、登录 cookie 等) 但只有满足我要求的表格?
非常欢迎链接到文章和现有实现,我的 Google 搜索返回了一些非常基本的示例。
提前致谢
马尔科
最佳答案
@Marko 我当然可以理解标准成员(member)系统可能包含比您需要的更多的功能,但事实是这真的无关紧要。成员(member)系统的某些部分您不会使用,就像您不会使用 .Net 的某些部分一样。 .Net 可以做很多您永远不会用到的事情,但您不会通过 .Net 并剥离该功能,对吗?当然不是。你必须专注于对你想要完成的事情很重要的事情,并从那里开始工作。不要陷入分析的瘫痪状态。你会浪费你的时间,转动你的轮子,最终不会得到比已经为你创造的更好的东西。现在微软确实有时会犯错,但他们确实做对了很多事情。您不必拥抱他们为实现您的目标所做的一切 - 您只需要了解什么对您的需求很重要。
至于Guids和ints作为主键,让我解释一下。主键和聚集索引之间有一个重要的区别。您可以在不属于主键的列上添加主键和聚集索引!这意味着如果按名称(或其他名称)排列数据更为重要,您可以自定义聚簇索引以准确反射(reflect)您的需要,而不会影响您的主键。让我换一种说法——主键和聚簇索引不是一个。我写了一篇关于如何向表中添加聚簇索引和主键的博文。聚簇索引将按照您需要的方式对表行进行物理排序,而主键将强制执行您需要的完整性。请查看我的博客文章,了解具体如何操作。
这是链接 - http://iamdotnetcrazy.blogspot.com/2010/09/primary-keys-do-not-or-should-not-equal.html .
其实很简单,你只需要先添加聚簇索引,然后再添加主键。必须按照那个顺序完成,否则你将无法完成。当然,这假定您使用的是 Sql Server。大多数人没有意识到这一点,因为 SQL Server 默认会在您的主键上创建聚集索引,但您所要做的就是先添加聚集索引,然后再添加主键,您就可以开始了。随着数据库和服务器系统的扩展,使用 int 作为主键会变得非常有问题。我建议使用 Guids 并添加聚簇索引以反射(reflect)您实际需要存储数据的方式。
现在,总而言之,我只是想告诉您去创造一些伟大的东西,不要被表面的细节所困扰,这些细节不会给您带来足够的性能提升,而实际上并不重要。生命太短暂。另外,请记住,您的系统只能与其最慢的代码段一样快。因此,请务必查看实际占用大量时间的事情并处理好这些事情。
还有一件事。你不能把你在网上看到的一切都当真。技术随着时间的推移而变化。有时,您可能会查看某人很久以前写的问题的答案,但今天已不再相关。此外,人们会回答问题并向您提供信息,而无需实际测试他们所说的内容是否属实。您可以为您的应用程序做的最好的事情就是对其进行压力测试。如果您使用的是 ASP.Net MVC,则可以在测试中执行此操作。您可以做的一件事是添加一个 for 循环,在您的测试中将用户添加到您的应用程序,然后进行测试。这是一个想法。还有其他方法。您只需要付出一点努力就可以将您的测试设计得很好或至少足以满足您的目的。
祝你好运!
关于c# - 用于超大型应用程序的 ASP.NET 自定义成员身份提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4175266/
我开发了一个具有基本安全性的 Spring Boot 应用程序。我有两个具有相同路径和不同 http 方法的端点。当我使用默认密码/使用 application.yml 中给出的密码包含基本安全性时,
我的代码是这样的: 或者,像这样: 如果我首先列出 webm 源,Firefox 4 会播放它,但 Firefox 3.6 也会尝试播放它(但会失败,因为它不支持 webm)。
我希望提供一个泛型类型作为类型参数而不首先将其解析为具体类型。换句话说,我正在寻找一种方法来指定从基类继承时可以使用的类型映射函数。 示例(不正确的)语法,希望比我能解释得更好: abstract c
我在 .NET 中编写了一些桌面应用程序,它们既提供了用于正常使用的前端 GUI,也提供了用于其他需求(例如扩展、调度、自动化、高级使用等)的命令行界面。命名两个可执行文件的最佳做法是什么,因为它们构
我最近在这里思考了很多关于屏幕抓取以及它可能是一项什么样的任务。所以我提出以下问题。 作为网站开发人员,您是否会公开简单的 API 以防止用户抓取屏幕,例如 JSON 结果? 然后这些结果可以实现缓存
我正在为一个项目使用 Dojo 1.9,但我不明白 dojo.provide 的正确替代方案与传统风格相比,AMD 风格。我正在阅读 this文档页面。 很明显,这就是旧语法映射到新语法的方式: 旧
我正在开发一个 Angular 应用程序。当我使用 ng serve 正常运行它时,它运行没有任何错误.但是,当我运行 ng build --prod ,它给出了以下错误。 ERROR in Ille
我有一个 Mac 应用程序。在我的 Mac 应用程序中,我的屏幕之一有一个包含文本字段的 scrollView。在同一屏幕上,我有一个需要提供打印选项的按钮。可以打印文本字段的文本。打印按钮应调用 M
我已经成功地为普通媒体文件提供媒体文件,但是当我尝试提供管理媒体文件时,我失败了。请帮我找出问题所在,因为我已经尝试解决问题几个小时但没有运气(也一直在谷歌搜索并阅读有关提供静态文件的 django
我正在尝试创建一个简单的错误处理项目,它会在收到错误(例如 404、422 或 500)后为 JSON 提供错误数据。我使用来自 this 的代码网站,但它不适合我。 我实际上有这两个类: 基本 Co
假设我有一个名为 Number 的类(class),我打算对 Number 进行大量相等比较对象。我担心通用 Number::equals(Object o) 的“开销”(类比较等...)方法。在这种
假定以下情况: 对等方A只希望将音频流发送给对等方B 对等B只希望将视频流发送给对等A 从而, 与创建报价 var sdpConstraints = { “必填”:{ 'OfferToReceiveA
因为我有一些角度,所以我想检查角度模数 360°: double angle = 0; double expectedAngle = 360; angle.Should().B
这是我的程序中构建的 monad 堆栈: type Px a = ReaderT PConf (State PState) a 其中 PConf 和 PState 是保存应用程序的配置和状态的任意数据
因为我有一些角度,所以我想检查角度模数 360°: double angle = 0; double expectedAngle = 360; angle.Should().B
我有一个小程序需要以某些权限运行,这意味着加载时会显示一条警告消息。如果用户拒绝警告消息,我想重定向到错误页面并解释发生了什么。有什么办法可以做到这一点吗? 我研究过让计时器运行并在特定时间段后重定向
从我可以从 Firebase 文档中推断出,似乎需要服务器来提供静态内容(html和 javascript),所以你需要有一台托管机器和一个静态内容服务器在某处启动并运行,或某些服务托管静态站点。 对
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 3 年前。 Improv
我的项目根目录的静态文件夹中有一个文本文件。 我想提供它,所以我创建了: @csrf_exempt def display_text(request): content = retur
我目前正在研究指针,为了进一步理解我正在尝试使用指针将两个数值数组连接成一个。代码如下所示。 #include void concat(int **pa,int **pb,int **pc) {
我是一名优秀的程序员,十分优秀!