如何在 FaunaDB 中连接多对一关系

How to connect Many-to-one relations in FaunaDB

我已将以下 GraphQL 架构上传到我的 FaunaDB:

type RSheet @collection(name: "sheets") {
  columns: [RColumn!]! @relation
  sections: [RSection]!
}

type RColumn @collection(name: "columns") {
  label: String!
  sheet: RSheet!
}

type RSection @embedded {
  label: String
  items: [[RItem!]]!
}

type RItem @embedded {
  value: String
  form: RItemForm
  column: RColumn!
}

enum RItemForm {
  STRING
}

这是一个包含列的 sheet 和一些包含构成 table 行的项目的部分。


现在,我创建了一个 sheet 以及两个列。

“sheets”数据库中的集合

{
  "ref": Ref(Collection("sheets"), "304268724760740364"),
  "sections": [
    {
      "label": null,
      "items": []
    }
  ]
}

“列”数据库中的集合

{
  "ref": Ref(Collection("columns"), "304268724764934668"),
  "label": "Begin",
  "sheet": Ref(Collection("sheets"), "304268724760740364")
},
{
  "ref": Ref(Collection("columns"), "304268724776469004"),
  "label": "End",
  "sheet": Ref(Collection("sheets"), "304268724760740364")
}

到目前为止一切正常。我可以创建 sheets and/or 列,更新和删除它们。


但是,如果我想使用 FaunaDB 的 GraphQL 添加部分项目,我无法 connect 项目的列。我收到一条错误消息,指出我必须提供该列的 ID!:

当我这样做时,只有 ID 被写入数据库并且没有创建连接 Ref(…)

“sheets”数据库中的集合

{
    "ref": Ref(Collection("sheets"), "304268724760740364"),
    "sections": [
      label: null
      {
        "items": [
          [
            {
              "value": "Item 1",
              "column": "304268724791149068"  /// EXPECTED: Ref(Collection("columns"), "304268724791149068")
            }
          ]
        ]
      }
    ]
  }

我错过了什么?

您不能在嵌入类型中创建关系。来自 docs on relations:

The relationship recognition algorithm looks at every field for all non-embedded types

我确实认为通过 @embedded 类型建立关系会很好,但这不是它们的真正目的,因此不受支持。

您将需要重新设计您的架构,以便每个连接都是非嵌入式类型。另外,二维数组也不可能有连接。

例子

考虑以下架构

type RSheet @collection(name: "sheets") {
  columns: [RColumn!]! @relation
  sections: [RSection]! @relation
}

type RColumn @collection(name: "columns") {
  label: String!
  sheet: RSheet! @relation
  items: [RItem!] @relation
}

type RSection @collection(name: "section") {
  label: String
  sheet: RSheet @relation
  items: [RSectionItemList!]! @relation
}

type RSectionItemList @collection(name: "section_item_list") {
  section: RSection! @relation
  items: [RItem!]! @relation
}

type RItem @collection(name: "item") {
  value: String
  form: RItemForm
  column: RColumn! @relation
  list: RSectionItemList @relation
}

enum RItemForm {
  STRING
}

请注意我是如何将二维数组拆分为包装器列表对象列表的。

A sheet 和列可以这样创建:

并且这样添加的项目: