我见过一些数据库设计,其中包含帐户表中的所有用户信息,包括密码,电子邮件,DOB,名字,姓氏等。
我见过其他一些有两张桌子的人
用户名(或电子邮件),密码,状态(已激活等),组(管理员,所有者,用户等)
和
nameFirst,nameLast,birthDay,birthMonth,birthYear等
上述方法有哪些优点和缺点?
答案 0 :(得分:2)
两种设计之间的差异主要是灵活性。如果帐户和用户数据共享一个表,则每个用户必须拥有一个帐户,并且每个帐户只能有一个用户(除非您添加另一个表以允许除了与该帐户一起使用的用户之外添加子用户数据,或者除非你在每个数据中添加具有重复帐户详细信息的新记录,这对于数据库应该做什么是非常糟糕和对立的)。
使用两个表,您可以轻松地在每个帐户中拥有多个用户,并且还可以选择允许帐户没有用户或用户没有帐户的情况,如果这样做会使您的用例受益。
权衡是,如果您想要为用户(或帐户中的用户)确定帐户,则必须在使用两个表时进行连接。如果您有一个表,那么您只需要获取该行以获取此信息。
答案 1 :(得分:1)
嗯,显而易见的主要问题是如果你想要两者的信息,你必须处理两个表。这可能会使您的查询稍微复杂化并可能降低性能。
由于所有该信息依赖于单个关键字段(此处最常用的用户名),我倾向于将其放在一个表中,除非在一个非常具体的情况下:例如,如果您想要让某人访问第一个表中的详细信息而不是第二个表中的详细信息,为了安全起见,您可以将其拆分(向第一个开放第一个,但将第二个仅限于那些需要额外细节的人 - 但是我'在这种情况下,d可能会将密码移动到第二个表格。)
除此之外,只要它不妨碍维持第三范式,我就会尽量减少对象的数量。
答案 2 :(得分:0)
我相信这取决于你的数据库设计师。只要您将来通过服务器端语言使用并不困难 - 这是一个可行的解决方案。
我在一个表中设置了带有凭据和敏感数据(加密)的dbs,并在另一个表中设置了所有其他内容。我还设置了一个dbs,它有一个表来容纳所有数据。
无论哪种方式,只需要1个查询语句来获取和/或操纵来自一个或两个表的数据。
答案 3 :(得分:0)
如果我们谈论相同的“对象”(用户和她的额外信息属于一起),将信息保存在单独的表格中,我更愿意避免。 但我可以想出两个很好的理由将它们分开:
如果您已设计或正在使用具有自己的表的单独身份验证系统,例如User
,但您需要添加其他信息。或者您有一个标准系统,但用户的信息/字段取决于您的客户:字段名称,字段数量......然后您可以将身份验证部分保持标准,并且已知额外信息部分是灵活的。
如果您的数据模型中有精心设计的Person/People
模型,包含地址,生日,您还有什么,您可以选择使用同一个表格为您的用户存储该信息。因此,您user
也会有person_id
或类似内容。
希望这有帮助。