【问题标题】:How to prevent duplicate id in creating objects from SPA? Or should I stay with the db?如何防止在从 SPA 创建对象时重复 id?还是我应该留在分贝?
【发布时间】: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 (&lt;ruleBytes&gt;) RETURNING id;,使用 Go 的 QueryRow 执行此查询,然后在结果行上调用 Scan 以获取 id。
  • 如果我使用on返回子句,这意味着在插入数据后,我必须快速更新它以将生成的id放入JSON
  • 如果它已经在自己的列中,为什么还要在json列中使用它,为什么要复制数据?
  • id 需要发回给 SPA 用户以启用对特定rule 的删除和编辑。我把它放在规则模型中。还是您建议模型不应包含 id 字段?
  • 模型,是的。 json 传给客户端,是的。 db中的json列,没有。

标签: postgresql go single-page-application


【解决方案1】:

让数据库生成新的 id,因为那正是 SERIAL types are for in PostgreSQL

在 golang 中,您可以使用 sql.DB.QueryRow(...).Scan() 插入新记录并检索生成的 id 使用 insert statement with a RETURNING clause,例如:

var newId int
query := "INSERT INTO rules (rule) VALUES ($1) RETURNING id"
err := db.QueryRow(query, newRule).Scan(&newId)
// TODO: check err
log.Printf("newId=%d", newId)

【讨论】:

    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多