如何解决无法使用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
}
}
这种作品,但有几个缺点:
- 如果客户存在,它将更新客户(或订阅)行,实际上是无操作更新。这还会更新潜在的
updated_at
列。 - 效率低下(请参阅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 举报,一经查实,本站将立刻删除。