在处理相关实体时防止无效状态

Preventing invalid state when dealing with related entities

考虑一个 (ReactJS) 应用程序,其中 GroupUser 实体通过多对多关系相互关联。

状态树如下所示:

{
  groups: {
    "1": {id: "1", name: "..."}, 
    ...
  },
  users: {
    "42": {id: "42", name: "..."}, 
  ...
  },
  memberships: [
    {groupId: "1", userId: "42"}, 
    ...
  ]
}

在 UI 中,用户可以 "select" 零个或多个组,每个组有零个或多个关联用户。目前以这样的状态表示:

{
  selectedGroupIds: {
    "1": {selectedUserIds: ["42", ...]}, 
    ...
  }
}

(顺便说一句,以下设计可能比上面的设计更可取,因为它更明确;希望对此​​提出评论):

{
  selectedGroupIds: [
    {id: "1", selectedUserIds: ["42", ...]}, 
    ...
  ]
}

不管怎样,回到正题:

目前,当在组上下文中选择用户时,组和用户在某个时刻断开连接(成员资格终止、用户被删除等),然后 selectedGroupIds 将处于无效状态。在写这篇文章时,我现在意识到这也适用于 memberships 当组或用户被删除时。

有什么方法可以设计状态树来避免上述情况的发生吗?或者在关系发生变化的情况下,人工管理是不可避免的吗?

membership ends, user gets deleted, etc. 时,您必须以级联方式更新状态并移除损坏的关系。这与其他基于关系的状态更新没有任何不同。

如果不想更新数据中的关系,也可以使数组成为条件数组:

memberships: [
    groups["1"] && users["42"] && {groupId: "1", userId: "42"}, 
    ...
  ].filter(o => o); // the filter is to ensure to remove null values that could be generated by conditions