用户信息和登录凭证的表设计?

11

首先,我想请您忘记关于哈希密码或与密码相关的任何内容,这个问题与保护密码等无关,我知道/理解应该如何处理。

考虑到读写性能,建立一个或多个表,哪种方法是存储所需数据的最佳方法?

单个表,例如:

用户表:id、用户名、密码、哈希值、电子邮件、 组、访问权限、地址、电话、 父母、创建时间戳、更新时间戳

多个表,例如:

用户表:id、用户名、密码、 哈希值、电子邮件、组、访问权限、 创建时间戳、更新时间戳

用户信息表:id、用户ID、 地址、电话、父母、创建时间戳、更新时间戳

如果用户信息字段可能随时间增长而增加,应该如何处理?

例如新字段: 生日日期、评论、情况

在查询方面,使用两个表是否比使用单个表更慢?

如果在这种情况下使用多个表仅用于维护具有分离数据的良好设计,那么这是否意味着它在性能方面根本没有用处?

如果您需要真实的SQL示例,请告诉我,我将提供一些内容以更新此内容。


顺便提一下,这种双表设计例如在Symfony的sfGuardPlugin中使用 http://www.symfony-project.org/plugins/sfGuardPlugin - Piskvor left the building
顺便提一下,age 是一个相对不稳定的数据,存储出生日期/年份并从中计算年龄会更好吧? - Piskvor left the building
@piskvor,说一个字段是年龄不是重点,呵呵,当然它应该是一个日期字段。所以让我把它改成反映没有错误的birthday_date,感谢你的回答和修复 :) - Prix
2个回答

5
您可能需要更多的表格,具体取决于您要存储的数据:
  1. 如果将来使用密码策略,用户不能重新使用以前使用过的密码怎么办?
  2. 一个用户可以有多个电子邮件吗?
  3. 一个用户可以属于多个组吗?
  4. 一个用户可以有多个电话号码吗?
  5. 只有一个父母?还是两个?父母是否在系统中?关于父母的哪些信息需要存储?
像这样存储的东西可能值得在其自己的单独表格中存储,这意味着将来维护应该会更容易。您需要考虑系统将如何更改。至于性能,如上所述,只要创建正确的索引并正确使用数据库,就不应该成为问题。

1
谢谢。那么,我在问题中提出的表只是样本,主要目的是更好地理解何时应该拆分和使用多个表,对性能是否有影响。我通常在制作任何其他东西之前都会制作数据库布局,并通常使用多个表,但我看到许多软件和Web应用程序仍然喜欢使用单个表...这让我思考是否应该保持我的风格以便维护性或者追求性能,有时我会对所有事情进行基准测试...哈哈,我很奇怪:( - Prix
如果您的信息列不断增长,甚至包括一些奇怪的东西,您会选择新建一个表吗?例如:表A用户凭证表B用户信息(id、user_id、地址、电话、父母、生日日期、评论、情况、ts_created、ts_update),然后您获得了新字段(特殊食品、最佳电影、最佳汽车、女性类型),我是说它们是用户信息,但与主要用户信息有点无关。您会选择新建一个类似于用户个人信息之类的表,还是将其保留在用户信息表中?您的列会变得多大呢? - Prix
1
不必担心将表分开,只要正确索引和规范化数据库,这不应该成为问题。如果有什么问题,它应该会帮助你处理一些更复杂的查询。通常情况下,如果您正确规范化数据库并遵循“书”的建议,您和其他人在上面工作会发现它更容易管理,单个表很快就会变得难以控制! - BenW
是的,最好使用简单的例子 :)至于你的第二个评论,这取决于奇怪的事情是什么,如果是这样的话,我可能会倾向于添加一个UserPreferences表,但实际上...只有在数据可能重复的情况下才应该添加表,比如电子邮件、地址、电话号码,如果有可能每个用户可以有多个。 - BenW
有很多关于规范化的教程、指南和书籍可以帮助你更好地理解,比我在评论中解释要好得多!最好的方法是使用谷歌,找到一些对你有意义的资料,希望这可以帮到你。 - BenW
显示剩余2条评论

4
你的多表设计看起来很合理——一个表包含用户数据,另一个表包含个人数据;如果你只需要用户数据(例如用于检查访问权限),那么个人数据就不相关了。
你提出的新字段可能会成为个人表中的新列。
使用2个(或更多)表并将它们连接在一起不会显著减慢速度,甚至可能会提高性能(使用良好的索引——在user_id上建立唯一索引是一个好的开始):
- 在SELECT时,速度差异将可以忽略不计 - 在INSERT / UPDATE时,在大多数情况下,这比单个表更好(例如,如果“users”表有很多读取,对persons的写入不会阻塞它们——而对于单个表,则可能发生)
此外,就我个人而言,我发现使用两个较窄的表比使用单个宽表更容易(无论是在代码还是在数据库管理方面)。

谢谢你提供这么有用的信息,我理解你关于锁定的观点,但我想知道在多少次访问后才会出现问题?再次感谢,这对我很有帮助,我会继续使用我的多表样式。 - Prix
那要看很多因素——实际查询、查询频率,甚至是服务器硬件。在一个案例中,我们在这个表上有大约100次读取/秒和1次写入/2秒(除了其他表的负载);这足以导致明显的减速;在将设计更改为多个表之后,性能得到了提高。 - Piskvor left the building

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