如何在 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 和列可以这样创建:
并且这样添加的项目:
我已将以下 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 和列可以这样创建:
并且这样添加的项目: