Database design 将所有用户放在同一个实体中是真的吗?

Database design 将所有用户放在同一个实体中是真的吗?,database-design,entity-relationship,data-modeling,Database Design,Entity Relationship,Data Modeling,好的,在设计ER图时,我们可以将所有具有不同任务(比如学生、管理员、教师)的程序用户放在同一个实体中,并给他们“type”属性吗?尤其是它们的属性都是一样的 正如其他人所说,最好为角色使用一个单独的参考(查找)表,并使用一个“用户角色”表来说明哪些用户拥有哪些角色。如果用户有重要的子类,许多属性只应用于这个子类,而在其他类上为空,那么您可以选择将这些属性存储在单独的表中。这方面有很多变化,但都归结为三种模式的组合: 将子类的属性吸收到超类表中(吸收) 为子类的属性创建一个单独的表,并在两个表中

好的,在设计ER图时,我们可以将所有具有不同任务(比如学生、管理员、教师)的程序用户放在同一个实体中,并给他们“type”属性吗?尤其是它们的属性都是一样的

正如其他人所说,最好为角色使用一个单独的参考(查找)表,并使用一个“用户角色”表来说明哪些用户拥有哪些角色。如果用户有重要的子类,许多属性只应用于这个子类,而在其他类上为空,那么您可以选择将这些属性存储在单独的表中。这方面有很多变化,但都归结为三种模式的组合:

  • 将子类的属性吸收到超类表中(吸收)
  • 为子类的属性创建一个单独的表,并在两个表中创建一行(扩展名)
  • 为具有超类属性(分区)副本的子类创建一个新表
不同的模式各有利弊。关于应用哪种模式的决定取决于很多因素,比如一个用户一次是否可以是多个子类(比如,一个男性、一个青少年和一个司机)


有关如何解决问题的更多信息,请搜索“Party model”的信息。

正如其他人所说,最好为角色使用单独的参考(查找)表,并使用“user\u roles”表说明哪些用户具有哪些角色。如果用户有重要的子类,许多属性只应用于这个子类,而在其他类上为空,那么您可以选择将这些属性存储在单独的表中。这方面有很多变化,但都归结为三种模式的组合:

  • 将子类的属性吸收到超类表中(吸收)
  • 为子类的属性创建一个单独的表,并在两个表中创建一行(扩展名)
  • 为具有超类属性(分区)副本的子类创建一个新表
不同的模式各有利弊。关于应用哪种模式的决定取决于很多因素,比如一个用户一次是否可以是多个子类(比如,一个男性、一个青少年和一个司机)


有关如何解决问题的更多信息,请搜索有关“派对模式”的信息。

如其他答案所述,有各种不同的选项,它们以不同的方式出现。我可以告诉你,根据我的经验,我从未后悔从角色解析用户。换言之:

  • 仅包含描述用户的属性的用户表。这些通常只是标识和身份验证(标识符、名称,通常是主要的身份验证电子邮件地址,通常是实际的身份验证属性,如密码、salt、加密密钥等)。请考虑如何注册stackoverflow

  • 角色的参考表,其中包含学生、教师、管理员等的行

  • 两者之间的关联,因此用户可能是零个、一个或多个角色的成员。即使您当前需要一对一,您也希望这是一个业务决策,而不是一个技术约束。除非您处理极速,否则该关联不应造成任何显著的性能影响(假设索引正确)

  • 然后,您可以通过权限等将角色与任务关联,从而自由地扩展到授权

诚然,您可以使用类型鉴别器作为用户的属性,但请考虑当1)企业决定用户可以担任多个角色,或2)您希望与角色而不是像我的授权示例中那样的用户建立关系时,这将有多大的限制


同样,您可以放弃用户表,只为每个用户类型(如教师、管理员等)创建单独的表。但是,您需要人为地合并这些表,以便对用户进行身份验证、授权或以其他方式处理。如果要扩展用户属性集,必须修改所有这些表。如果你想添加一个角色,你必须用一个新的表来改变你的模式,而不是仅仅在角色表中添加一行。

正如其他答案中所述,有各种不同的选择,它们以不同的方式改变。我可以告诉你,根据我的经验,我从未后悔从角色解析用户。换言之:

  • 仅包含描述用户的属性的用户表。这些通常只是标识和身份验证(标识符、名称,通常是主要的身份验证电子邮件地址,通常是实际的身份验证属性,如密码、salt、加密密钥等)。请考虑如何注册stackoverflow

  • 角色的参考表,其中包含学生、教师、管理员等的行

  • 两者之间的关联,因此用户可能是零个、一个或多个角色的成员。即使您当前需要一对一,您也希望这是一个业务决策,而不是一个技术约束。除非您处理极速,否则该关联不应造成任何显著的性能影响(假设索引正确)

  • 然后,您可以通过权限等将角色与任务关联,从而自由地扩展到授权

诚然,您可以使用类型鉴别器作为用户的属性,但请考虑当1)企业决定用户可以担任多个角色,或2)您希望与角色而不是像我的授权示例中那样的用户建立关系时,这将有多大的限制

同样,您可以放弃用户表,只为每种用户类型(如教师、管理员等)创建单独的表,但随后您将