无法使用Hasura和GraphQL建立具有关系的高效基本突变

问题描述

我正在PostgreSQL数据库之上构建API, 使用Hasura和GraphQL作为中间层。

我经营一家服务公司,客户可以订阅“每周清洁咖啡机”或“为莫吉托酒柜加气”之类的服务。客户只能订阅一次相同的服务。

我们是一家以销售为导向的组织, 因此我们有不同的应用程序,人们可以在其中添加(customer,subscription)组合。 我们想要一个接受此(customer,subscription)组合的终点,并处理诸如customer(如果不存在)之类的细节。

我们首先尝试对Hasura使用以下突变:

mutation InsertOrders {
  insert_orders(objects: [
    { 
      customer: {data: {name: "GE"}},subscription:  {data: {name: "Coffee Refill"}}
    }
  ]) 
  {
    affected_rows
  }
}

仅当"GE"不是现有客户并且"Coffee Refill"不是现有订阅时,此操作才会成功。 然后,我们尝试在Hasura中使用"on_conflict"功能:

mutation InsertOrders {
  insert_orders(objects: [
    { 
      customer: {data: {name: "GE"},on_conflict: { constraint:customers_name_unique,update_columns:[name] }
      },subscription:  {data: {name: "Coffee Refill"},on_conflict: { constraint:subscriptions_name_unique,update_columns:[name] }
      }
    }
  ]) 
  {
    affected_rows
  }
}

这种作品,但有几个缺点:

  1. 如果客户存在,它将更新客户(或订阅)行,实际上是无操作更新。这还会更新潜在的updated_at列。
  2. 效率低下(请参阅1.)。我们有一个很小的数据库(数百行),并且在一个请求中插入大约50 (customer,subscription)个连击的尝试超时。

数据库定义在这里:

CREATE TABLE customer (
  id UUID PRIMARY KEY,name VARCHAR(50) UNIQUE
);

CREATE TABLE subscription (
  id UUID PRIMARY KEY,name VARCHAR(50) UNIQUE
);

CREATE TABLE orders (
  customer UUID REFERENCES customer (id),subscription UUID REFERENCES subscription (id),PRIMARY KEY (customer,subscription)
)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...