Database 处理用户门户和客户网站的架构中的单用户表

Database 处理用户门户和客户网站的架构中的单用户表,database,database-design,architecture,Database,Database Design,Architecture,我们正在为rest应用程序服务器运行单个数据库。我们有三种类型的用户 为顾客 对于管理员,以及 合作伙伴 目前,它们有不同的表,用户名和密码也分别位于不同的表中。现在,随着用户的扩展,我们需要重构这个模式。 那么,一个具有角色的用户表格是否可以?(此处角色可以是管理员、合作伙伴或客户、经理) 或 如果我们使用用户和角色表,我们是否应该保持原样,因为我们将遇到问题: 如果管理员获取用户名,则由于唯一约束,该用户名对于客户或合作伙伴不能再次相同 我认为用户角色不能像“客户”一样,因为客户不是一个角色

我们正在为rest应用程序服务器运行单个数据库。我们有三种类型的用户

  • 为顾客
  • 对于管理员,以及
  • 合作伙伴
  • 目前,它们有不同的表,用户名和密码也分别位于不同的表中。现在,随着用户的扩展,我们需要重构这个模式。 那么,一个具有
    角色的
    用户
    表格是否可以?(此处
    角色可以是管理员、合作伙伴或客户、经理)

    如果我们使用用户和角色表,我们是否应该保持原样,因为我们将遇到问题:

  • 如果管理员获取用户名,则由于唯一约束,该用户名对于客户或合作伙伴不能再次相同
  • 我认为用户角色不能像“客户”一样,因为客户不是一个角色。角色可以是管理员、经理等

  • 我认为这不是一张桌子的正确方式。您的建议是什么?

    是的,由于以下原因,最好单独保存表格:
    1.如您所述,客户不是角色。

    2.由于管理员数量有限,因此从拥有客户的大型数据集中获取记录进行身份验证/授权没有意义。这会妨碍性能。

    是的,最好保留单独的表,原因如下:
    1.如您所述,客户不是角色。
    2.由于管理员数量有限,因此从拥有客户的大型数据集中获取记录进行身份验证/授权没有意义。它会妨碍性能。

    用户
    身份证
    用户ID
    角色(外键)
    等等

    角色
    身份证
    名字

    上述结构是最佳实践。 如果您确实需要管理员、合作伙伴或客户的额外字段 您可以为每个实体创建单独的实体,并且可以将用户作为外键引用,如下所示


    客户
    身份证
    名字
    用户(外键)
    etc

    用户
    身份证
    用户ID
    角色(外键)
    等等

    角色
    身份证
    名字

    上述结构是最佳实践。 如果您确实需要管理员、合作伙伴或客户的额外字段 您可以为每个实体创建单独的实体,并且可以将用户作为外键引用,如下所示


    客户
    身份证
    名字
    用户(外键)

    etc

    考虑到一个用户可以有多个角色(例如:-管理员也可以是经理,客户也可以是合作伙伴),我认为您应该为用户管理创建三个表。因此,用户表和角色表具有多对多关系。为了创建这种关系,您必须创建第三个表,其中userId和roleId作为复合主键

    此外,我注意到您将在数据库中保存用户的密码。出于安全原因,请勿以纯文本形式存储密码。Instaed使用单向散列算法存储密码的散列。
    您可以从这里了解更多信息->

    考虑到一个用户可以有多个角色(例如:-管理员也可以是经理,客户也可以是合作伙伴),我认为您应该为您的用户管理创建三个表。因此,用户表和角色表具有多对多关系。为了创建这种关系,您必须创建第三个表,其中userId和roleId作为复合主键

    此外,我注意到您将在数据库中保存用户的密码。出于安全原因,请勿以纯文本形式存储密码。Instaed使用单向散列算法存储密码的散列。
    您可以从这里了解更多信息->

    我将在哪里保存用户名和密码?仅在用户表中?@JohnnyMartin,是的,您可以将用户名和密码(加密)保存在用户表本身。根据您的设计,用户不能有多个角色,但无论如何对我有效,因为我们只有一个角色。但我将把它改为user_type表,这样任何人都可以理解该用户是单一类型的。我将把用户名和密码保存在哪里?仅在用户表中?@JohnnyMartin,是的,您可以将用户名和密码(加密)保存在用户表本身。根据您的设计,用户不能有多个角色,但无论如何对我有效,因为我们只有一个角色。但我将把它改为user_type表,这样任何人都可以理解该用户是单一类型的。不,我们正在使用BCrypt保存密码。但问题是,使一个角色为用户管理员或客户或合作伙伴的表可以获得相同的用户名。我们也在做社交网络登录,所以他们可以有相同的社交网络id(fb或gmail)和用户id。由于管理它们,我们将陷入困境。对于任何表设计,请尝试使用数字主键。在这种情况下,使用自动递增UserID作为用户表的主键。要唯一标识用户,请在注册用户时收集用户电子邮件地址。因此,当他们使用社交登录时,您不必担心与其他用户发生冲突。记住,当他们第一次使用社交登录时,要将用户详细信息添加到数据库中。你没有领会这个答案背后的意思。您有一个表,其中包含作为密码哈希(和其他详细信息)登录的所有用户,但没有关于其角色的信息(称为用户)。它将为每个用户提供一个条目,而不管特定用户实际拥有多少条规则。然后是一个列出所有可能角色(称为角色)的表。这里只有3行:一行用于客户,一行用于管理员,一行用于合作伙伴。然后还有第三个表,通知哪个用户具有哪个角色,同一个用户可能在那里分配了多个角色。请注意,这是一种可能的解决方案。这在很大程度上取决于所采取的要求和假设。不,我们正在使用BCrypt保存密码。但问题是制作一个角色为