我应该将用户和员工存储在同一个表中吗?

时间:2018-04-19 20:52:07

标签: sql database algorithm database-design database-table

我正在为我的新应用程序进行数据库设计,该应用程序在系统中具有两个不同角色的人员。这两个组是用户和员工。主要区别在于,用户有activeUserusernamepasswordsecurity-questionanswer,并且工作人员有activeStaffposition 。这两个字段还共享用户和员工所需的下一个字段,例如FirstNameLastNameMiddleEmail。最初我认为这将非常简单,我将使用选项accountTypeUser添加标记Staff。这是我的界面示例:



$('#frm_type').on('change',displayForm);
function displayForm() {
    var fldType = $(this).find(':selected').data('type');
    
    if(fldType === 'isUser') {
        $('.isUser').show();
        $('.isStaff').hide();
    }

    if(fldType === 'isStaff') {
        $('.isStaff').show();
        $('.isUser').hide();
    }

    if(!fldType) {
        $('.isUser').hide();
        $('.isStaff').hide();
    }
}

#main-container {
	padding-top: 20px;
}
.isUser {
	display: none;
}
.isStaff {
	display: none;
}

<!DOCTYPE html>
<html lang="en">

<head>
  <title>My Application</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script language="javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script language="javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>

<body>
  <div id="main-container" class="container">
      <form name="frmSaveuser" id="frmSaveuser" class="frm-agencySubmit" data-frm="SaveUser" autocomplete="off">
        <div class="form-group required">
          <input type="text" class="form-control" name="frm_firstname" id="frm_firstname" placeholder="Enter First Name" maxlength="50" required>
        </div>
        <div class="form-group required">
          <input type="text" class="form-control" name="frm_lastname" id="frm_lastname" placeholder="Enter Last Name" maxlength="50" required>
        </div>
        <div class="form-group">
          <input type="text" class="form-control" name="frm_lastname" id="frm_lastname" placeholder="Enter Last Name" maxlength="1">
        </div>
        <div class="form-group required">
          <input type="email" class="form-control" name="frm_email" id="frm_email" placeholder="Enter email" maxlength="80" required>
        </div>
        <div class="form-group required">
          <select class="form-control" name="frm_type" id="frm_type" required>
              <option value="">-- Select Account Type --</option>
              <option value="1" data-type="isUser">User</option>
              <option value="2" data-type="isStaff">Staff</option>
          </select>
        </div>
        <div class="isUser">
          <div class="form-group required">
            <select class="form-control" name="frm_activeuser" id="frm_activeuser" required>
               <option value="">-- Active User --</option>
               <option value="0">No</option>
               <option value="1">Yes</option>
            </select>
          </div>
          <div class="form-group required">
            <select class="form-control" name="frm_systemadmin" id="frm_systemadmin" required>
               <option value="">-- System Admin --</option>
               <option value="0">No</option>
               <option value="1">Yes</option>
            </select>
          </div>
          <div class="form-group required">
            <input type="text" class="form-control" name="frm_username" id="frm_username" placeholder="Enter UserName" maxlength="50" required>
          </div>
          <div class="form-group password-container">
            <input type="password" class="form-control" name="frm_password" id="frm_password" placeholder="Enter Password" maxlength="50" required>
          </div>
          <div class="form-group">
            <select class="form-control" name="frm_questionid" id="frm_questionid">
                <option value="">-- Select the question --</option>
                <option value="1">What was the name of your first pet?</option>
                <option value="2">In what city were you born?</option>
                <option value="3">What is your mother's maiden name?</option>
                <option value="4">What is your favorite vacation spot?</option>
                <option value="5">What is your favorite musical group?</option>
                <option value="6">Where did you meet your spouse?</option>
                <option value="7">What model was your first car?</option>
             </select>
          </div>
          <div class="form-group">
            <input type="text" class="form-control" name="frm_answer" id="frm_answer" placeholder="Enter Answer" maxlength="100">
          </div>
        </div>
        <div class="isStaff">
          <div class="form-group required">
            <select class="form-control" name="frm_activestaff" id="frm_activestaff" required>
                <option value="">-- Active Staff --</option>
                <option value="0">No</option>
                <option value="1">Yes</option>
            </select>
          </div>
          <div class="form-group required">
            <input type="text" class="form-control" name="frm_position" id="frm_position" placeholder="Choose Position" required>
          </div>
        </div>
        <button type="submit" name="frm_submit" id="frm_submit" class="btn btn-primary">Submit</button>
      </form>
  </div>
</body>

</html>
&#13;
&#13;
&#13;

接下来是上述概念的问题:让我们说我们创建帐户用户,但该帐户必须是员工,或者其他方式也必须是用户。在这种情况下,我需要第三个帐户类型选项Both(用户和员工)。这将使查询数据更加困难,因为我们必须始终包含至少两个选项。我想知道是否有更好的方法来处理这个问题?此外,我们还要考虑在帐户之间切换,例如,有用户帐户的人员将成为员工或员工成为用户。这必须是可用的,我正在寻找有效和长期的解决方案。到目前为止,我的数据库中只有一个表,用于存储用户和员工的信息。

2 个答案:

答案 0 :(得分:3)

评论太长了。你真的不应该在同一个表中组合用户和员工。您可能要做的是为员工中的每个人创建一个用户记录,因此users表中有user_id

为什么不呢?这两个组可能有非常不同的要求,将它们连接到不同的表。例如,员工可以成为等级制度的一部分。或者他们可能有可用的时间表。或者他们可能匹配的技能。或者如果他们是雇员的就业信息。

如果PII存在问题,那么维护员工与用户的PII肯定有不同的要求。

也就是说,所有员工也可能是用户。我会将这两个概念保持不同,将user_id链接到用户数据。

答案 1 :(得分:1)

我要去三张桌子:

  • 用户
  • 员工

Person包含适用于任何人的数据,例如姓名元素和电子邮件,无论该人是用户或工作人员还是其他任何人。 StaffUser包含描述此角色中属性的特定字段,并通过辅助密钥引用Person

如果您愿意,可以创建一个CompleteUser视图来合并UserPerson字段,这样您就可以像访问一个表一样访问它们({{{{ 1}},当然)。