代码之家  ›  专栏  ›  技术社区  ›  Tristan

我应该为同一平台内的不同web产品创建一个单独的用户表吗?

  •  5
  • Tristan  · 技术社区  · 12 年前

    我们有一个面向年轻专业人士的网络产品,让他们有可能创建自己的页面来展示自己的职业身份。 所以一张桌子 users 既有关于用户的信息(电子邮件、密码、姓名),包括他们的凭据,也有关于他们的页面的信息(是否付费、页面地址、主题)

    现在,我们想为招聘人员提供注册我们的平台浏览候选人的可能性。招聘人员也可以是一个有页面的用户,但不一定要这样做。

    现在我们有两种方法:

    A/创建表格 recruiters 带有招聘人员的姓名和证书以及一列 user_id 连接 ID 用户 如果他们已经创建了一个站点。

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

    数据库结构:

    users
    ID name email password group_id premium theme page_address
    
    recruiters
    ID name email password company_id user_id
    

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

    • 优点:一张桌子上有所有的证书。
    • 不便:如果我们接触到数百万用户,招聘人员之间的任何查询都必须在一个巨大的表格中占据一小部分。此外:大量的加入以获得每个用户的网站信息。

    数据库结构:

    users
    ID name email password group_id
    
    pages
    user_id premium theme page_address
    
    recruiters
    user_id company_id
    

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

    感谢您的投入!

    特里斯坦

    1 回复  |  直到 12 年前
        1
  •  5
  •   Kad    11 年前

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

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

    • Users 是还是不是 Recruiters 将是一个 0..1 <-> 1 关系或 可选择的 One to One
    • Pages 属于 用户 将是一个 1 <-> 1 关系或 一对一
    • 招聘人员 可能有 将是一个 0..1<->1. 关系或 可选择的 一对一

    此练习有助于您了解如何列出实体并组织 外键 。这是一个很好的第一步,在您的情况下,它为我们提供了三个表格: 用户 , 招聘人员 。注意如何 外键 对于 一对一 关系被置于强制 1 cardinality 桌子。

    enter image description here

    现在,要确定将数据列放在哪里,以及是否应该有新的表:一个简单的技巧是将所有数据都写在 denormalized 实体将通过瞄准您拥有的衍生程度最高的实体来实现。

    enter image description here

    这个例子很明显,但我仍然认为它回答了您关于组实体和列重复的问题和疑问。

    enter image description here

    这时我意识到我忘了把 Companies 将被陈述为:

    • 公司 可以有多个 招聘人员 将是一个 1..* <-> 1 关系或 One to Many

    enter image description here

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

    如果你有任何问题或觉得这是错误的,请随时发表评论!