POST 实体及其子资源作为一项交易或孤儿移除策略
POST entity with its sub-resources as one transaction OR strategy for orphan removal
我有 spring 后备箱 api。我在概念上有 2 个实体,名为 Venue 和 Address,其中 Venue 必须有一个地址。
我的问题是我必须先 POST 一个地址实体,然后 POST 我的地点实体和地址实体的自身 link。
在我开始编写浏览器客户端代码之前,这似乎还不错。我不喜欢这样一个事实,即一旦地址被持久化到数据库中,在 Venue 被持久化之前发生了一些事情中断了用户连接,我最终会在我的数据库中得到一个垃圾实体,因为它不会被关联与任何东西。在这些情况下,我可以通过删除刚刚创建的地址来对我的客户进行回滚编码,但是如果我的 api 被第三方使用,那么我就会遇到问题。
有什么方法可以让我在 POST 父实体的同时 post 所有子资源数据?
如果没有,是否有任何通用策略来清除孤立记录?
这里有几个可供考虑的选项。
如果同一个地址被 POST 两次,那么数据库中不应该有两条记录。确保这一点的方法是规范化地址输入,然后检查该地址是否已添加。如果已经添加 return 409 冲突或 200 OK。如果实际上创建了一个新地址,那么您可以 return 201 CREATED。您必须首先规范化数据,以便同一地址的多个变体不会导致多个条目。例如,规范化时将所有 "Smith St." 和 "smith street" 以及 "Smith Str." 变成 "SMITH STREET"。您可以将此逻辑应用于地址中的所有字段。然后你可以检查该地址是否已经在数据库中。
如果工作量太大,请考虑在数据库中不要让地址成为它自己的 table/collection。也许只是让 Address 成为 Venue 中的一个字段。如果在某些时候代码需要从地点获取地址并将其放入自己的 table,那么当它出现时可以根据需要发生。
另一个想法是拥有一个将 Venue 和 Address 作为输入的服务。也许您可以将其称为 VenueRequest。该对象将包含两个主要字段,Venue 和 Address。该服务将完成将地址和地点存储到数据库的工作。
我有 spring 后备箱 api。我在概念上有 2 个实体,名为 Venue 和 Address,其中 Venue 必须有一个地址。 我的问题是我必须先 POST 一个地址实体,然后 POST 我的地点实体和地址实体的自身 link。 在我开始编写浏览器客户端代码之前,这似乎还不错。我不喜欢这样一个事实,即一旦地址被持久化到数据库中,在 Venue 被持久化之前发生了一些事情中断了用户连接,我最终会在我的数据库中得到一个垃圾实体,因为它不会被关联与任何东西。在这些情况下,我可以通过删除刚刚创建的地址来对我的客户进行回滚编码,但是如果我的 api 被第三方使用,那么我就会遇到问题。 有什么方法可以让我在 POST 父实体的同时 post 所有子资源数据? 如果没有,是否有任何通用策略来清除孤立记录?
这里有几个可供考虑的选项。
如果同一个地址被 POST 两次,那么数据库中不应该有两条记录。确保这一点的方法是规范化地址输入,然后检查该地址是否已添加。如果已经添加 return 409 冲突或 200 OK。如果实际上创建了一个新地址,那么您可以 return 201 CREATED。您必须首先规范化数据,以便同一地址的多个变体不会导致多个条目。例如,规范化时将所有 "Smith St." 和 "smith street" 以及 "Smith Str." 变成 "SMITH STREET"。您可以将此逻辑应用于地址中的所有字段。然后你可以检查该地址是否已经在数据库中。
如果工作量太大,请考虑在数据库中不要让地址成为它自己的 table/collection。也许只是让 Address 成为 Venue 中的一个字段。如果在某些时候代码需要从地点获取地址并将其放入自己的 table,那么当它出现时可以根据需要发生。
另一个想法是拥有一个将 Venue 和 Address 作为输入的服务。也许您可以将其称为 VenueRequest。该对象将包含两个主要字段,Venue 和 Address。该服务将完成将地址和地点存储到数据库的工作。