Database design 我是否应该为同一平台内的不同web产品创建单独的用户表?

Database design 我是否应该为同一平台内的不同web产品创建单独的用户表?,database-design,relational-database,database-schema,Database Design,Relational Database,Database Schema,我们有一个面向年轻专业人士的网络产品,让他们有可能创建自己的页面来展示自己的专业身份。 因此,一个表users,其中既有关于用户的信息(电子邮件、密码、姓名),包括他们的凭据,也有关于他们的页面的信息(高级与否、页面地址、主题) 现在,我们想为招聘人员提供一个机会,让他们注册我们的平台,浏览应聘者。招聘人员也可以是具有页面的用户,但不必这样做 现在我们有两种方法: A/创建一个包含招聘人员姓名和凭据的表招聘人员,以及一列用户id以连接表用户的id(如果他们创建了网站) 优点:该产品可以很容易地

我们有一个面向年轻专业人士的网络产品,让他们有可能创建自己的页面来展示自己的专业身份。 因此,一个表
users
,其中既有关于用户的信息(电子邮件、密码、姓名),包括他们的凭据,也有关于他们的页面的信息(高级与否、页面地址、主题)

现在,我们想为招聘人员提供一个机会,让他们注册我们的平台,浏览应聘者。招聘人员也可以是具有页面的用户,但不必这样做

现在我们有两种方法:

A/创建一个包含招聘人员姓名和凭据的表
招聘人员
,以及一列
用户id
以连接表
用户的
id
(如果他们创建了网站)

  • 优点:该产品可以很容易地由两个不同的团队分别开发
  • 不便之处:如果招聘人员也是用户,则姓名和凭据重复。 我们需要在更新一个凭据时更新两个凭据,或者让他们有两个不同的电子邮件/密码组合,一个用于他们的用户帐户,一个用于他们的招聘人员帐户
数据库结构:

users
ID name email password group_id premium theme page_address

recruiters
ID name email password company_id user_id
users
ID name email password group_id

pages
user_id premium theme page_address

recruiters
user_id company_id
B/使用不同的
组id
将招聘人员添加到
用户
表中,并将有关用户页面的所有信息移动到另一个表中(是否高级、页面地址、主题)。我们还将为招聘人员提供第三张表格,其中包含任何特定于他们的信息

  • 优点:一个包含所有凭据的表
  • 不便之处:如果我们接触到数以百万计的用户,招聘人员之间的任何查询都必须在一个巨大的表中取一个很小的子集。另外:大量的加入可以为每个用户获取站点信息
数据库结构:

users
ID name email password group_id premium theme page_address

recruiters
ID name email password company_id user_id
users
ID name email password group_id

pages
user_id premium theme page_address

recruiters
user_id company_id
C/还有其他解决办法吗

感谢您的投入


Tristan

关系数据库体系结构不是一门精确的科学,但您可以依靠一些常见的准则来做出正确的决策。在您提供的第一个选项中,可以很容易地确定存在列重复的情况。从概念的角度来看,你的专栏很少有完全相同的含义。
密码
栏用于登录您的网站,无论您是否是招聘人员。这并不总是一个问题,但这是一个很好的提示,应该有一个更好的关系模式来设计您的数据模式

解决这些问题的一个好方法是在对象之间建立概念关系。例如:

  • 用户
    是或不是
    招聘人员
    将是
    0..1
    关系还是可选的
  • 页面
    属于
    用户
    将是
    1
    关系或
  • 招聘人员
    可能有
    页面
    可能是
    0..1
    关系或可选
本练习帮助您了解如何列出实体和组织外键。这是一个很好的第一步,在您的情况下,它为我们提供了三个表:
用户
招聘人员
页面
。请注意关系的外键是如何放置在必填的
1
表中的

现在,要确定数据列的放置位置以及是否应该有新表:一个简单的技巧是,通过针对您拥有的最派生的实体来编写实体将拥有的所有内容

这个例子很明显,但我仍然认为它回答了您的问题以及您对组实体和列复制的疑问

此时,我意识到我忘了包括将被声明为以下内容的
公司
实体:

  • 公司
    可以有多个
    招聘人员
    可能是
    1..*1
    关系或

再一次,请记住,人们可能并不总是同意这种方法,但考虑到这种小背景;这是一个简单的思路。您一直在寻找的答案是:列的意思是重复,这暗示您应该以不同的方式处理数据模式。这是一个例子


如果您有任何问题或认为这是错误的,请随时发表评论

我觉得B方案不错。即使您拥有数百万用户,您的数据库也应该使用正确的索引来处理这一问题。您仍应获得1-2ms的查询时间。如果由于某种原因确实出现问题,您可以将非活动/已删除的用户移动到历史表中,以使该表仅限于活动用户。您可以创建一个视图来为您执行公共联接,这将简化查询。谢谢您的评论,数据库分片如何?如果我们有分离的数据库,这将成为一个问题。现在考虑分片可能有点不成熟。如果你的网站发展到拥有1000万用户的地步,切分可能不是你最大的问题。在这一点上,我会认为这是一个预先成熟的优化。但如果你真的做到了,你是对的,跨服务器维护数据库可能需要很多工作。您可以随时查看类似Mongo的内置切分功能。感谢您的详细回答。事实上,我们最终选择了A方法,主要原因是它们是两种不同的产品,所以我们现在把“用户”视为“候选人”,并为招聘人员提供一个单独的表格。随着时间的推移,我们将看到这是否是正确的选择!