设计灵活的关联实体架构

时间:2020-07-18 11:32:00

标签: javascript graphql

让我们认为我正在建立一个博客网站。该网站具有博客文章和类别,每个文章可以与一个或多个类别相关联。

type Category {
    id: Int!
    name: String!
}

type Post {
    id: Int!
    title: String!
    categories: [Category]!
}

我的网站需要提供两种用户界面-一种用于撰写帖子的作者,另一种用于读者。

阅读器的用户界面非常简单,它显示了标题,内容以及与该帖子相关的类别的列表。

作者的UI稍微复杂一些,它可能包括一些输入,发布按钮,用于内容的富文本编辑器以及我特别感兴趣的内容-复选框列表,用于将帖子与某些内容相关联像这样的全球可用类别

<ul>
  <li>
    <input type="checkbox" checked="true"> Art
  </li>
  
  <li>
    <input type="checkbox"> Kitchen
  </li>
  
  <li>
    <input type="checkbox"> Garden
  </li>
</ul>

它显示了全球可用类别的列表,然后作者可以勾选复选框,并将帖子与所选类别相关联。创建帖子以及对其进行编辑时将显示此UI。

我可能有这种模式来获取帖子和类别

type Query {
    post: Post
    categories: [Category!]!
}

但是,如果我正在编辑帖子,则必须在UI中至少进行一些数据转换/循环,以找出哪些类别已被选择,哪些类别未被选择。

我正在构建的应用程序在许多不同的地方都需要这样做,因此我需要一个好的模式来解决此问题,以便于管理。

经过一段时间,我得出的结论是我也许可以做类似的事情

type Category {
    id: Int!
    name: String!
}

type PostCategoryEdge {
    selected: Boolean!
    node: Category!
}

# It uses a connection type, because I might need pagination
# or filtering, if I have many entities
type PostCategoryConnection {
    edges: [PostCategoryEdge!]!
}

type Post {
    id: Int!
    title: String!
    categories: PostCategoryConnection!
}

这在某种程度上解决了我的问题-类别现在不仅包含关联的类别,而且还包含全球可用类别的列表,并且关联的类别将selected属性设置为true。

这样,我可以直接在边缘类型上对所选属性进行建模,并且当用户提交更改时,我可以执行过滤器/映射以检索所选边缘的ID,并将其添加到突变中。

这是可行的解决方案吗?此外,对于读者的UI,我的Categories属性现在也不太有用。如果我只想显示选定的类别,则需要在Post模式中添加一个过滤器,例如selectedOnly或另一个属性。如果我的架构通常面向中继规范,那么应该使用哪种命名约定更好?

我使用的是PostCategoryConnection而不是CategoryConnection,因为selected属性仅在从帖子上下文中查询时才有意义,而不是整体上(我可能会有CategoryConnection查询中使用的categories

是否有更好的解决方案,与上面描述的完全不同?

0 个答案:

没有答案