更新在另一个对象中使用的对象

时间:2019-01-27 02:05:28

标签: javascript angular rest database-design

我有一个允许您创建员工的应用程序,但是在重命名员工职位时遇到问题。

我有一系列的职位,看起来像这样:

positions: [
  { id: 1, title: 'Masseuse' },
  ...
];

如果我创建员工,则必须从下拉列表中选择一个职位,而员工最终将看起来像这样:

employees: [
  { id: 1, name: 'John Doe', title: 'Masseuse' },
  ...
];

在用户重命名职位之前,此方法可以正常工作。例如,如果用户将“ Masseuse”重命名为“ Massage Therapist”,则职位下拉列表将按预期更新,但是具有该职位的员工仍将说“ Masseuse”。

如果用户重命名职位,我是否还需要查找具有该职位的每个员工并分别更新他们?还是我应该采用其他方法?我想知道雇员对象是否应该存储职位ID,因为它永远不会改变,然后以某种方式使用它来显示他们的职位标题,但是我不知道这将如何工作。

我还没有后端开发或数据库体系结构的经验,因此这可能不是重要的信息,但是目前我仅使用伪造的REST API。我最终将建立一个实际的数据库,但尚未完成。

FWIW,我正在使用Angular和以下模拟API:https://github.com/typicode/json-server

3 个答案:

答案 0 :(得分:1)

很好的推理。

您的想法是正确的解决方法。

这与数据库规范化的概念保持一致,后者是一种减少体系结构冗余的结构化方法。

在Wikipedia中也数据库规范化link

答案 1 :(得分:1)

您可以使用职位ID来存储标题。然后通过存储的位置ID显示标题。

employees: [
 { id: 1, name: 'John Doe', titleId: 1 },
 ...
];

然后您的下拉菜单如下所示

<select [(ngModel)]="editingEmployee.titleId"">
  <option *ngFor="let x of positions" [value]="x.id">{{x.title}}</option>
</select>

现在,当您显示员工时,您可以从存储的员工titleId中引用职位数组。

<div *ngFor="let employee of employees">
   {{employee.name}} is a {{getPosition(employee.titleId)}}
</div>

在您的组件中

getPosition(titleId) {
  const position = this.positions.filter(p => p.id === titleId);

  return position[0] ? position[0].title : '';
}

请参阅此工作stackblitz

答案 2 :(得分:1)

一种可能的解决方案是在员工对象中存储职位ID而不是职位。

当您需要显示它时,可以构造该对象的“视图”:

let positions = [
  { id: 1, title: 'Masseuse' },
  ...
];

let employees = [
  { id: 1, name: 'John Doe', positionId: 1 },
  ...
];

function getPositionTittle(id, positions) {
  const position = positions.find(p => p.id === id);

  if (!position) return '';

  return position.title;
}

function prepare(employee, positions) {
  const title = getPositionTittle(employee.positionId, positions);
  return {
    ...employee,
    title
  };
}

const employeeView = prepare(employees[0], positions);
// employeeView = { id: 1, name: 'John Doe', positionId: 1, title: 'Masseuse' }