我已经完成了许多Web应用程序,在这些应用程序中,第一件事情就是创建一个用户表格,其中包括用户名、密码、姓名、电子邮件和所有其他通常的杂项。我的当前项目提出了这样的情况,即非用户记录需要与用户类似地发挥作用,但不需要成为一级用户。
创建第二个表people_tb
作为主要的关系表和数据存储是否合理,并且仅使用users_tb
进行认证?将user_tb
与people_tb
分离是否会带来任何问题?如果这是常见的做法,那么有哪些策略、解决方案以及缺点呢?
我已经完成了许多Web应用程序,在这些应用程序中,第一件事情就是创建一个用户表格,其中包括用户名、密码、姓名、电子邮件和所有其他通常的杂项。我的当前项目提出了这样的情况,即非用户记录需要与用户类似地发挥作用,但不需要成为一级用户。
创建第二个表people_tb
作为主要的关系表和数据存储是否合理,并且仅使用users_tb
进行认证?将user_tb
与people_tb
分离是否会带来任何问题?如果这是常见的做法,那么有哪些策略、解决方案以及缺点呢?
这绝对是一个好主意,因为你在规范化数据库。我在正在编写的应用程序中做了类似的设计,其中有一个员工表和一个用户表。用户可以来自外部公司或员工,所以我有单独的表,因为员工总是用户,但用户不一定是员工。
你将遇到的问题是,每当使用用户表时,你几乎总是想获取人员表中的姓名或其他常用属性,以便显示出来。
从编码的角度来看,如果您使用纯SQL,就需要更多的精力来解析select语句。如果您使用ORM库,则可能会更加复杂。我对这些没有足够的经验。
在我的应用程序中,我正在使用Ruby on Rails编写它,所以我不断地在做像employee.user.name这样的事情,如果我把它们放在一起,只需写employee.name或user.name即可。
从性能方面来看,你要访问两个表而不是一个表,但是如果有适当的索引,这应该是可以忽略不计的。例如,如果你有一个包含主键和人名的索引,那么数据库将首先访问用户表,然后访问人员表上的索引(几乎直接命中),所以性能几乎与只有一个表相同。
你还可以在数据库中创建视图,将两个表连接起来以获得额外的性能增强。我知道在Oracle的后期版本中,甚至可以在视图上放置索引(如有需要)以提高性能。
我经常这样做,因为对我来说,“用户”(用户名、密码、创建日期、最后登录日期)的概念与“个人”(姓名、地址、电话、电子邮件)是不同的。你可能会发现其中一个缺点是,你的查询通常需要更多的连接才能获取所需的信息。例如,如果你只有一个登录名,你需要连接“people”表来获取名字和姓氏。如果你基于用户ID主键构建所有内容,这会减轻一些问题,但仍然会出现。
这正是我们所做的,因为我们有数百万人员记录,但只有数千个用户。我们还将地址、电话和电子邮件分别存储在关系表中,因为许多人拥有多个这些信息。关键是不要依赖姓名作为标识符,因为姓名并不唯一。确保通过某种类型的代理键(最好是整数或GUID)而不是姓名连接表。
非常合理。
例如,看看 aspnet_* 服务表 这里。
它们内置的模式具有 aspnet_Users
和 aspnet_Membership
,后者表格包含有关给定用户的更多扩展信息(哈希密码等),但是 aspnet_User.UserID
在模式的其他部分中用于引用完整性等。
总之,如果属性是不同的实体,则将其放在单独的表中非常常见且良好的设计,就像您的情况一样。