【发布时间】:2019-02-01 16:10:30
【问题描述】:
我有一个从 golang api 获取数据的反应应用程序,该应用程序从 postgres 数据库中查询数据。我的模型之一是深度嵌套的 JSON,所以我在 postgres 中使用了 JSONB 数据类型。
CREATE table rules (
id serial primary key,
rule jsonb
);
在golang中,我有结构
type Rule struct {
ID int `json:"id"`
Name string `json:"name"`
...succeeding fields are deeply nested data
}
在 SPA 中我有模型
interface Rule {
id number
name string
....same as from the golang api model
}
为了在 SPA 中创建一个新的 Rule 对象,我将 0 分配给 id。新创建的规则被发送到 golang rest api。然后在 api 中,我首先向 postgres 数据库询问序列 id 的下一个值(使用 POSTGRES nextval),将获取的 id 分配到 Rule struct ID 字段中,
nextValidId := <result of nextval>
rule.ID = nextValidId
JSON 编组规则对象然后插入到 db
ruleBytes, _ := json.Marshal(rule)
INSERT INTO rules_table VALUES (<nextValidId>, <ruleBytes>);
通过这种方式,我避免了在 SPA 处理 ID 生成时可能发生的重复 ID。但是,我发现我的方法已经有些复杂了。我知道我也可以从 SPA 生成 id,但是如何在不使用上面使用的方法的情况下避免重复的 id?还是我想多了?
更新1:
我还考虑在没有ID 字段的golang 中添加另一个Rule 结构,这样我就不必使用nextval 只是将id 放入JSON 中,但是拥有多个用于插入的模型是否是一个好的编程设计并从 db 和另一个模型中检索以响应 SPA?
【问题讨论】:
-
将插入与返回子句一起使用。
INSERT INTO rules_table (rule) VALUES (<ruleBytes>) RETURNING id;,使用 Go 的 QueryRow 执行此查询,然后在结果行上调用 Scan 以获取 id。 -
如果我使用on返回子句,这意味着在插入数据后,我必须快速更新它以将生成的id放入JSON
-
如果它已经在自己的列中,为什么还要在json列中使用它,为什么要复制数据?
-
id 需要发回给 SPA 用户以启用对特定
rule的删除和编辑。我把它放在规则模型中。还是您建议模型不应包含 id 字段? -
模型,是的。 json 传给客户端,是的。 db中的json列,没有。
标签: postgresql go single-page-application