因此,在我简单的学习网站,使用建立在ASP.NET 认证系统。

我加入现在一个用户表保存的东西的喜欢他的拉链,出生日期等。我的问题是:

  1. 在新的表,应该在关键应用户的名称(string)或用户标识是,GUID打量他们使用 asp_ tables.
  2. 如果最佳做法是使用那个丑陋的guid,任何人都不会知道如何得到它?这似乎不是可以很容易地名(System.Web.HttpContext.Current.User.Identity.Name)
  3. 如果你建议我用既不是(不guid也没有用户名的领域提供的ASP.NET 认证)然后我怎么做ASP.NET 身份验证?一种选择我喜欢的是使用的电子邮件地址的用户登录,但如何让我ASP.NET 认证系统使用一个电子邮件地址,而不是一个用户名称?(或者没有什么可以做的还有,那只是我的决定我"认识"userName实际上是一个电子邮件地址?

请注意:

  • 我不要求如何得到GUID。净,我只是参考用户名列在 asp_ tables 作为guid。
  • 用户名是独特的ASP.NET 认证。
有帮助吗?

解决方案

我建议使用用户名作为主要的关键在表如果用户名将是独特的,有一些很好的理由来这样做:

  1. 主要的关键将是一个集群的指标,并因此寻找一个用户的详细信息,通过他们的用户名将是非常快捷。
  2. 它会停止重复的用户名出现
  3. 你不必担心使用两件不同的信息(用户名或guid)
  4. 它将编写代码的更加容易,因为没有查找两位的信息。

其他提示

你应该使用的一些独特的ID,GUID你说或一些其他自动生成的关键。然而,这个数目不应该是对用户可见。

一个巨大的好处是你所有的代码可以工作,对用户标识,但用户名是不是真的绑到它。然后,用户可以更改其名称(其中我找到了有用的站点)。这是特别有用的,如果您使用的电子邮件地址作为用户的登录...这是非常便于用户使用(然后,他们没有记住20Id情况下,他们共同的用户标识是一个受欢迎的一个)。

你应该使用UserID。这是ProviderUserKey财产的MembershipUser.

Guid UserID = new Guid(Membership.GetUser(User.Identity.Name).ProviderUserKey.ToString());

我会用一个userid。如果你想使用一个用户名,你要进行的"更改的用户名"的功能非常昂贵。

我同意Palmsey, 虽然似乎有一个小小的错误,在他的代码:

Guid UserID = new Guid(Membership.GetUser(User.Identity.Name)).ProviderUserKey.ToString());

Guid UserID = new Guid(Membership.GetUser(User.Identity.Name).ProviderUserKey.ToString());

我想说的使用的用户标识,使用户名仍然可以更改,不影响的主要关键。我还要设置的用户名列是唯一阻止重复的用户名。

如果你将主要搜索的用户名,而不是UserID然后使用户名聚集指标和设置主要的关键要的非集群。这会给你最快的访问时,寻找用户名,然而,如果你将主要寻找Userid然后离开这个群集的索引。

编辑:这也将适应更好地与目前的ASP.Net 成员资格表,因为他们还使用UserID作为主要关键。

这是旧的,但我只是想让人找到这个要注意的一些事情:

  1. Aspnet成员资格数据库的优化,当它涉及到用户访问的记录。聚集的索引寻求(最佳)在sql服务器使用记录时寻找使用loweredusername和editor.这使得一个很大的意义,因为我们只有提供用户名去当用户首先发送全权证书。

  2. Guid userid将给予更大的指标小于一个int但这不是真的重要,因为我们往往只有1检索记录(用户)的时间和条款的碎片的数量读取通常大大超过了该数量的写和编辑的一个用户表人根本不更新这些信息的所有经常。

  3. 该regsql脚本,创造aspnet成员表可以编辑这样,而不是使用NEWID作为默认的用户标识,这可以使用NEWSEQUENTIALID()提供性能更好(I具有分析此)。

  4. 配置文件。有人创建一个"新的学习网站"不应试图重新发明车轮。其中一个网站,我们的工作对于使用一个框版本的aspnet成员表(不包括可怕的资料系统)和用户表中含有近2亿用户的记录。即使有这样的高数量记录,选择仍然快,因为,正如我所说的开始,数据库索引注重loweredusername+editor到执行集群索引寻求对这些记录以及一般来说,如果sql是做一个群集的索引寻求1记录,你不会有任何问题,即使有大量的记录提供的,你不添加列的表格,并开始拉回来太多的数据。

  5. 担心一个guid在这个系统,对我来说,基于实际成绩和经验的系统,是不成熟的优化。如果你有一个int用你的用户名,但系统中执行最佳的子查询,因为你的自定义指标的设计,等等。该系统不会的规模。微软的家伙有没有一个一般良好的工作与aspnet会员db,并有更多的有生产力的事情要重点在于变化的用户标识到int。

我会用一个自动增加的数字通常一个int.

你想保留的大小关键尽可能地小。这让你指数的小型和益处的任何外键。此外你是不是紧紧地联结数据设计的外部用户的数据(这适用于aspnet GUID)。

一般Guid不出好主键因为他们都很大,并插入可能发生在任何潜在的数据页上的表格内而不是在最后的数据页上。主要的例外是,如果你正在运行的多头振复制的数据库。Guid是非常有用的钥匙在这种情况下,但我猜你只有一个数据库,因此这不是一个问题。

如果你要被使用LinqToSql发展,我建议使用一个Int作为一个主要关键。我有许多问题时,我有关系建立的非Int领域,即使时限(x)段有限,以使它成为一个独特的领域。

我不知道如果这是一个已知中的错误LinqToSql或什么,但我有问题它在当前的项目,我不得不换出PKs和驻在若干表格。

我同意迈克的石头。我也建议仅使用一GUID在事件你要追踪一个巨大的数量的数据。否则,一个简单的自动增加整数(Id)列就足够了。

如果你需要的GUID.净是可爱,你可以得到一个由一个简单的...

Dim guidProduct As Guid = Guid.NewGuid()

Guid guidProduct = Guid.NewGuid();

我同意迈克的石。我的公司最近实施了一个新的用户表以外的客户(相对于内部用户进行身份验证通过LDAP)。对于外部用户,我们选择要储存GUID作主的关键和储存用户名为varchar具有独特的限制的用户名的领域。

还有,如果你要保存的密码领域,我强烈推荐储存的密码作为一个盐渍,散列的二进制数据库中。这样,如果有人破解你的数据库,他们就不必访问您的顾客的密码。

我会用guid在我的代码和如已经提到的一个电子邮件地址为用户名。是的,毕竟,已经独特和令人难忘的用户。也许甚至沟guid(v。争论).

有人提到使用聚集指标在GUID如果这正在使用你的代码。我想避免这种情况,特别是如果插入高;该指数将重新构建,每次插入一个记录。聚集索引的工作以及在自动增加Id虽然因为新记录所附只。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top