【问题标题】:Database design: 1 table or 2?数据库设计:1 表还是 2?
【发布时间】:2011-07-25 18:24:58
【问题描述】:

我见过一些数据库设计,它在帐户表中包含所有用户信息,包括密码、电子邮件、出生日期、名字、姓氏等。

我见过一些有两张桌子的人

用户名(或电子邮件)、密码、状态(激活等)、组(管理员、所有者、用户等)

nameFirst、nameLast、birthDay、birthMonth、birthYear 等

以上方法的优缺点是什么?

【问题讨论】:

  • 我个人更喜欢将用户相关数据和身份验证相关数据分开(每个身份验证方法的表格)。在这种情况下,您可以轻松维护大量身份验证系统。
  • 2 张桌子,useruser_info 这是我的方式

标签: mysql database-design authentication


【解决方案1】:

如果我们谈论的是同一个“对象”(用户和她的额外信息属于一起),我希望避免将信息保存在单独的表格中。 但我可以想到两个很好的理由将它们分开:

  • 如果您已经设计或正在使用具有自己的表的单独身份验证系统,例如User,但您需要添加其他信息。或者您有一个标准系统,但用户的信息/字段取决于您的客户:字段名称,字段数量......然后您可以保持身份验证部分标准,并且已知额外信息部分是灵活的。

  • 1234563所以你user 也会有person_id 或类似的东西。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我相信这取决于数据库设计者。只要您将来通过服务器端语言工作并不困难 - 这是一个可行的解决方案。

    我已经在一个表中设置了带有凭据和敏感数据(加密)的数据库,而在另一个表中设置了所有其他内容。我还设置了有一个表格来存放所有这些数据的数据库。

    无论哪种方式,只需要 1 个查询语句即可从一个或两个表中获取和/或操作数据。

    【讨论】:

      【解决方案3】:

      这两种设计的区别主要在于灵活性。如果账户和用户数据共享一个表,那么每个用户都必须有一个账户,并且每个账户只能有一个用户(除非你添加另一个表以允许除了与账户同住的用户之外还可以添加子用户数据,或者除非您在每个记录中添加具有重复帐户详细信息的新记录,这非常糟糕,并且与数据库应该做的事情背道而驰)。

      使用两个表,您可以轻松地在每个帐户中拥有多个用户,并且还可以选择允许帐户没有用户或用户没有帐户的情况,如果这样做有利于您的用例.

      折衷方案是,如果您想要执行诸如确定用户(或帐户中的用户)的帐户之类的操作,则如果您使用两个表,则必须进行联接。如果您有一个表,您所要做的就是获取行来获取此信息。

      【讨论】:

        【解决方案4】:

        嗯,明显的主要问题是,如果您想从两个表中获取信息,则必须处理这两个表。这可能会使您的查询稍微复杂化,并可能会降低性能。

        由于所有信息都依赖于单个关键字段(此处最有可能是用户名),因此我倾向于将其放在一个表中,除非在一个非常特定的情况下:例如,如果您想让某人访问第一个表中的详细信息而不是第二个表中的详细信息,您可以出于安全目的将其拆分(向所有人开放第一个表,但将第二个限制为仅需要额外详细信息的人 - 但我在这种情况下,d 可能会将密码移动到第二个表中)。

        除此之外,只要不妨碍维护第三范式,我会尽量减少对象的数量。

        【讨论】:

        • 我认为身份验证信息只需要一次,当用户通过身份验证时。
        • @zerkms,这很好,但您在查询数据库时不需要 取出每一列。无论桌子有多少,您只需询问您需要什么。
        • 我知道,我只是指出你的“嗯,明显的主要问题是,如果你想从两个表中获取信息,你必须处理两个表。”。从经过身份验证的表只使用一次的角度来看,这种情况并不常见。另一方面 - 用户数据表会更少,因此更有可能适合内存。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-30
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        相关资源
        最近更新 更多