使用 graphql 模式将数据透视到 dgraph 的多对多
Many to many with pivot data to dgraph using graphql schema
我有使用关系数据库的波纹管多对多关系,我想将其转换为 dgraph 数据库。
这个关系在主元 table 中也有额外的列:products_stores
就像 price
、disc_price
.
我有以下使用 graphql 的 dgraph 模式:
type Product {
id: ID!
name: String! @id
slug: String! @id
image: String
created_at: DateTime!
updated_at: DateTime!
stores: [Store] @hasInverse(field: products)
}
type Store {
id: ID!
name: String! @id
logo: String
products: [Product] @hasInverse(field: stores)
created_at: DateTime!
updated_at: DateTime!
}
我是图形数据库的新手,我不知道如何定义这些额外的数据透视列。
如有任何帮助,我们将不胜感激。
要对仅是 linking 枢轴 table 且不包含任何其他信息的枢轴 table 建模,然后按照上述方法对其建模。但是,如果您的数据透视表 table 包含有关关系的其他信息,那么您将需要使用中间 linking 类型对其进行建模。和上面的思路差不多。我更喜欢这些 linking 类型有一个描述 link 的名称。例如,我在这种情况下将其命名为 Stock
,但该名称可以是您想要的任何名称。我也更喜欢 camelCase 作为字段名称,所以我的示例也反映了这种偏好。 (我也添加了一些搜索指令)
type Product {
id: ID!
name: String! @id
slug: String! @id
image: String
createdAt: DateTime! @search
updatedAt: DateTime! @search
stock: [Stock] @hasInverse(field: product)
}
type Store {
id: ID!
name: String! @id
logo: String
stock: [Stock] @hasInverse(field: store)
createdAt: DateTime! @search
updatedAt: DateTime! @search
}
type Stock {
id: ID!
store: Store!
product: Product!
name: String! @id
price: Float! @search
originLink: String
discPrice: Float @search
}
hasInverse
指令仅在反向关系的一个边上是必需的,如果你想提高可读性,你可以在两端定义它而没有任何副作用
此模型允许您非常简单地查询许多常见用例,而无需像您可能在 sql 中使用的那样执行额外的连接语句。 Dgraph 最好的部分是所有这些查询和变更都是为您生成的,因此您不必编写任何解析器!下面是一个在特定价格范围内查找商店中所有商品的示例:
query ($storeName: String, $minPrice: Float!, $maxPrice: Float!) {
getStore(name: $storeName) {
id
name
stock(filter: { price: { between: { min: $minPrice, max: $maxPrice } } }) {
id
name
price
product {
id
name
slug
image
}
}
}
}
对于在特定商店中仅查找特定产品名称的查询,然后使用 cascade 指令删除不需要的 Stock 节点(直到 Dgraph 完成 nested filters RFC 进行中)
query ($storeName: String, $productIDs: [ID!]!) {
getStore(name: $storeName) {
id
name
stock @cascade(fields:["product"]) {
id
name
price
product(filter: { id: $productIDs }) @cascade(fields:["id"]) {
id
name
slug
image
}
}
}
}
我有使用关系数据库的波纹管多对多关系,我想将其转换为 dgraph 数据库。
这个关系在主元 table 中也有额外的列:products_stores
就像 price
、disc_price
.
我有以下使用 graphql 的 dgraph 模式:
type Product {
id: ID!
name: String! @id
slug: String! @id
image: String
created_at: DateTime!
updated_at: DateTime!
stores: [Store] @hasInverse(field: products)
}
type Store {
id: ID!
name: String! @id
logo: String
products: [Product] @hasInverse(field: stores)
created_at: DateTime!
updated_at: DateTime!
}
我是图形数据库的新手,我不知道如何定义这些额外的数据透视列。
如有任何帮助,我们将不胜感激。
要对仅是 linking 枢轴 table 且不包含任何其他信息的枢轴 table 建模,然后按照上述方法对其建模。但是,如果您的数据透视表 table 包含有关关系的其他信息,那么您将需要使用中间 linking 类型对其进行建模。和上面的思路差不多。我更喜欢这些 linking 类型有一个描述 link 的名称。例如,我在这种情况下将其命名为 Stock
,但该名称可以是您想要的任何名称。我也更喜欢 camelCase 作为字段名称,所以我的示例也反映了这种偏好。 (我也添加了一些搜索指令)
type Product {
id: ID!
name: String! @id
slug: String! @id
image: String
createdAt: DateTime! @search
updatedAt: DateTime! @search
stock: [Stock] @hasInverse(field: product)
}
type Store {
id: ID!
name: String! @id
logo: String
stock: [Stock] @hasInverse(field: store)
createdAt: DateTime! @search
updatedAt: DateTime! @search
}
type Stock {
id: ID!
store: Store!
product: Product!
name: String! @id
price: Float! @search
originLink: String
discPrice: Float @search
}
hasInverse
指令仅在反向关系的一个边上是必需的,如果你想提高可读性,你可以在两端定义它而没有任何副作用
此模型允许您非常简单地查询许多常见用例,而无需像您可能在 sql 中使用的那样执行额外的连接语句。 Dgraph 最好的部分是所有这些查询和变更都是为您生成的,因此您不必编写任何解析器!下面是一个在特定价格范围内查找商店中所有商品的示例:
query ($storeName: String, $minPrice: Float!, $maxPrice: Float!) {
getStore(name: $storeName) {
id
name
stock(filter: { price: { between: { min: $minPrice, max: $maxPrice } } }) {
id
name
price
product {
id
name
slug
image
}
}
}
}
对于在特定商店中仅查找特定产品名称的查询,然后使用 cascade 指令删除不需要的 Stock 节点(直到 Dgraph 完成 nested filters RFC 进行中)
query ($storeName: String, $productIDs: [ID!]!) {
getStore(name: $storeName) {
id
name
stock @cascade(fields:["product"]) {
id
name
price
product(filter: { id: $productIDs }) @cascade(fields:["id"]) {
id
name
slug
image
}
}
}
}