我正在为我的新应用程序进行数据库设计,该应用程序在系统中具有两个不同角色的人员。这两个组是用户和员工。主要区别在于,用户有activeUser
,username
,password
,security-question
和answer
,并且工作人员有activeStaff
和position
。这两个字段还共享用户和员工所需的下一个字段,例如FirstName
,LastName
,Middle
和Email
。最初我认为这将非常简单,我将使用选项accountType
或User
添加标记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;
接下来是上述概念的问题:让我们说我们创建帐户用户,但该帐户必须是员工,或者其他方式也必须是用户。在这种情况下,我需要第三个帐户类型选项Both
(用户和员工)。这将使查询数据更加困难,因为我们必须始终包含至少两个选项。我想知道是否有更好的方法来处理这个问题?此外,我们还要考虑在帐户之间切换,例如,有用户帐户的人员将成为员工或员工成为用户。这必须是可用的,我正在寻找有效和长期的解决方案。到目前为止,我的数据库中只有一个表,用于存储用户和员工的信息。
答案 0 :(得分:3)
评论太长了。你真的不应该在同一个表中组合用户和员工。您可能要做的是为员工中的每个人创建一个用户记录,因此users表中有user_id
。
为什么不呢?这两个组可能有非常不同的要求,将它们连接到不同的表。例如,员工可以成为等级制度的一部分。或者他们可能有可用的时间表。或者他们可能匹配的技能。或者如果他们是雇员的就业信息。
如果PII存在问题,那么维护员工与用户的PII肯定有不同的要求。
也就是说,所有员工也可能是用户。我会将这两个概念保持不同,将user_id
链接到用户数据。
答案 1 :(得分:1)
我要去三张桌子:
Person
包含适用于任何人的数据,例如姓名元素和电子邮件,无论该人是用户或工作人员还是其他任何人。 Staff
和User
包含描述此角色中属性的特定字段,并通过辅助密钥引用Person
。
如果您愿意,可以创建一个CompleteUser
视图来合并User
和Person
字段,这样您就可以像访问一个表一样访问它们({{{{ 1}},当然)。