5

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

现在,我们希望为招聘人员提供注册我们的平台以浏览候选人的可能性。招聘人员也可以是拥有页面的用户,但不是必须的。

现在我们的两种方法:

A/ 创建一个表recruiters,其中包含招聘人员的姓名和凭据,如果他们创建了一个站点,则创建一个与表user_id连接的列。IDusers

  • 优点:产品可以很容易地由两个不同的团队单独开发。
  • 不方便:如果招聘人员也是用户,则重复名称和凭据。我们需要在更新一个凭据时更新这两个凭据,或者让他们拥有两种不同的电子邮件/密码组合,一种用于他们的用户帐户,一种用于他们的招聘人员帐户。

数据库结构:

users
ID name email password group_id premium theme page_address

recruiters
ID name email password company_id user_id

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

  • 好处:一张桌子,上面有所有的凭据。
  • 不方便:如果我们接触到数百万用户,招聘人员之间的任何查询都必须从一张巨大的表格中提取一小部分。另外:大量加入以获取每个用户的站点信息。

数据库结构:

users
ID name email password group_id

pages
user_id premium theme page_address

recruiters
user_id company_id

C/还有其他解决方案吗?

感谢您的投入!

特里斯坦

4

1 回答 1

5

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

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

  • Users是或不是Recruiters将是一种0..1 <-> 1 关系或可选 的一对一
  • Pages属于 aUsers将是一种1 <-> 1关系或一对一
  • Recruiters可能有Pages一个0..1 <-> 1关系或一个可选 的一对一

本练习可帮助您了解如何列出实体和组织外键。这是一个很好的第一步,在您的情况下,它为我们提供了三个表UsersRecruitersPages。请注意一对一关系的外键是如何放置在强制基数表中的。1

在此处输入图像描述

现在确定将数据列放置在哪里以及是否应该有新表:一个简单的技巧是通过定位您拥有的最衍生实体来编写您的非规范化实体将拥有的所有内容。

在此处输入图像描述

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

在此处输入图像描述

在这一点上,我意识到我忘记包含Companies将这样声明的实体:

  • Companies可以有多个Recruiters将是一个1..* <-> 1关系或一对多

在此处输入图像描述

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

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

于 2013-08-22T14:10:36.173 回答