Sql 对于每种类型的用户,将登录名和密码放在一个表中还是多个表中?

Sql 对于每种类型的用户,将登录名和密码放在一个表中还是多个表中?,sql,database,database-design,Sql,Database,Database Design,我有3种不同类型的用户,每种类型的用户都可以有其他类型的用户没有的列和与表的关系,但它们都有登录名(唯一)和密码, 你会怎么做: 为每种类型或类型创建一个表 为所有表创建一个表,或 为它们创建一个表,仅用于登录和密码,为所有其他内容创建一个表,并用FK绑定它们 别的 第3项是您建议的最佳选项(为澄清起见,稍作更新): 为登录名、密码和其他共享内容创建一个表,为所有其他未共享内容创建一个单独的表,并用FK绑定 除了不存储密码外,请存储加密密码的哈希版本 另一种方法是为用户分配组和/或角色。这

我有3种不同类型的用户,每种类型的用户都可以有其他类型的用户没有的列和与表的关系,但它们都有登录名(唯一)和密码,
你会怎么做:

  • 为每种类型或类型创建一个表
  • 为所有表创建一个表,或
  • 为它们创建一个表,仅用于登录和密码,为所有其他内容创建一个表,并用FK绑定它们
  • 别的

第3项是您建议的最佳选项(为澄清起见,稍作更新):

  • 为登录名、密码和其他共享内容创建一个表,为所有其他未共享内容创建一个单独的表,并用FK绑定
除了不存储密码外,请存储加密密码的哈希版本

另一种方法是为用户分配组和/或角色。这可能比固定的表结构更灵活,允许您动态添加新角色。但这取决于你的需要,这对你是否有用

正如Aaronaught指出的,在主表中,您需要一个
AccountType
,以确保用户只能拥有其中一个角色。必须记住在加入表时检查此列的值,以确保用户只有一个角色处于活动状态


外键上的唯一约束确保用户只能拥有一次角色。

在构建最新系统时,我遇到了这个问题。这里有一个对我非常有帮助的帖子:


我使用了不相交的子类型解决方案,这里描述得很好:

我想说这取决于:)它们还有什么共享的吗?是否要在一页上显示它们?用户可以被“转移”吗?同一个用户可以有两种类型吗?是的,他们也可以共享FirstName、LastName等。一个用户不能有两种类型。我不知道你说的转移是什么意思,所以我想不是:)。把他们共享的所有东西都放在同一张桌子上。使用此选项可以查看表中的一件事,即不存在阻止两个不同用户类型表中的两行引用“login\u password”中的同一行的约束table@Omu:在每个FK表的该列上放置一个
UNIQUE
约束,并在主表中使用一个鉴别器列(
AccountType
)。不管怎样,你应该有鉴别器,它对效率至关重要(马克,我认为你应该加上这个)。@Aaronaught:说得好。当我最初发布我的答案时,我不清楚每个用户只能有一个角色,但我现在可以从Omu的评论中看出这一点。@A你能解释一下,如果我有这个模式:帐户(AccountID,login,password,UserType(这是char,因为我需要知道这个帐户的用户类型))UserType1(id,AccountID,…)UserType2(id,AccountID,…)您是如何做到您所说的?主表中的AccountType将如何防止用户拥有多个角色?这不会产生约束,我看,这个解决方案,从约束的角度来看是完美的,但我认为它会更慢,我会有更多的问题与所有这些复合FK