使用 graphql 模式将数据透视数据转换为 dgraph 的多对多

问题描述

我使用关系数据库拥有以下多对多关系,我想将其转换为 dgraph 数据库

many to many relation with pivot data

该关系在数据透视表中还有额外的列:products_storespricedisc_price

我有使用 graphql 的 bellow 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!
}

我是图形数据库的新手,我不知道如何定义这些额外的数据透视列。

任何帮助将不胜感激。

解决方法

要对一个仅包含不包含其他信息的链接数据透视表的数据透视表进行建模,请按照上述方法对其进行建模。但是,如果您的数据透视表包含有关关系的附加信息,那么您将需要使用中间链接类型对其进行建模。和上面的想法差不多。我更喜欢这些链接类型有一个描述链接的名称。例如,我在本例中将其命名为 Stock,但该名称可以是您想要的任何名称。对于字段名称,我也更喜欢使用驼峰命名法,因此我的示例也反映了这种偏好。 (我也添加了一些搜索指令)

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
      }
    }
  }
}

对于在特定商店中仅查找特定产品名称的查询,然后使用级联指令删除不需要的 Stock 节点(直到 Dgraph 完成 nested filters RFC in progress)

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
      }
    }
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...