我做过很多web应用,你要做的第一件事就是创建一个用户表,里面有用户名、密码、名字、电子邮件和所有其他常见的东西。我目前的项目呈现了一种情况,即非用户记录需要类似于用户的功能,但不需要成为第一级用户的能力。
创建第二个表people_tb,即主关系表和数据存储,并且只使用users_tb进行身份验证是否合理?从people_tb中分离出user_tb有什么问题吗?如果这是普遍的做法,有哪些策略和解决方案以及缺点?
发布于 2008-09-18 14:29:01
这当然是一个好主意,因为您正在规范化数据库。我在我正在编写的一个应用程序中做了类似的设计,其中我有一个雇员表和一个用户表。用户可能来自外部公司或员工,所以我有单独的表,因为员工始终是用户,但用户可能不是员工。
您将遇到的问题是,每当使用user表时,您几乎总是希望person表获得您想要显示的名称或其他常见属性。
从编码的角度来看,如果您使用的是直接的SQL,那么在心理上解析select语句需要花费更多的精力。如果你使用的是ORM库,这可能会有点复杂。我对这些没有足够的经验。
在我的应用程序中,我用Ruby on Rails编写它,所以我经常做像employee.user.name这样的事情,如果我把它们放在一起,它就只是employee.name或user.name。
从性能的角度来看,您命中的是两个表,而不是一个表,但是如果有适当的索引,它应该可以忽略不计。例如,如果您有一个包含主键和人名的索引,则数据库将命中user表,然后是person表的索引(几乎直接命中),因此性能几乎与拥有一个表相同。
您还可以在数据库中创建一个视图,将两个表连接在一起,从而为您提供额外的性能增强。我知道在较新版本的Oracle中,如果需要提高性能,您甚至可以在视图上建立索引。
发布于 2008-09-18 14:17:39
我经常这样做,因为对我来说,“用户”(用户名、密码、创建日期、上次登录日期)的概念与“人”(姓名、地址、电话、电子邮件)不同。你可能会发现的一个缺点是,你的查询通常需要更多的连接才能得到你想要的信息。如果您只有一个登录名,则需要连接"people“表以获取名字和姓氏。如果您将所有内容都建立在用户id主键的基础上,这种情况会稍微减轻一些,但仍然会弹出。
发布于 2008-09-18 14:15:51
如果user_tb有身份验证信息,我会把它和people_tb分开。然而,我会保持两者之间的关系,大多数用户的信息都将存储在people_tb中,除了身份验证所需的所有信息(我猜这些信息不会用于太多其他用途),我认为这是设计和效率之间的一个很好的折衷。
https://stackoverflow.com/questions/92894
复制相似问题