Firestore:处理与预订应用程序的并发
Firestore: handling concurrency with booking app
我目前有一个 bookings
和一个 bookable
集合。 bookings
中的每个文档都包含一个日期范围(check-out
和 check-in
)和对 bookable
个文档的引用数组。
我对如何保证同一 bookables
的两个重叠 bookings
不会同时写入感到有点困惑。据我所知,我无法通过交易之类的方式 ,所以我想知道我的选择是什么(也许重组我存储数据的方式等)。
如有任何指点或建议,我们将不胜感激。
编辑:
假设 用户 A 想要预订与 用户 B 相同的两个项目,并且时间范围相同。他们几乎同时加载预订 UI 并确认他们的选择。
在为他们的每个请求在 bookings
集合中创建新文档之前,该应用程序将执行获取查询以检查是否存在任何重叠,如果 none 存在则插入新的预订文档.应用程序检查 booking
集合中的重叠与创建新文档之间的那部分时间似乎会导致 window 不一致(例如,可能允许两个文档具有重叠的时间范围和项目待创建)。
基于集合中符合特定条件的其他文档的存在,事务是否可以帮助防止将新文档写入该集合?
为防止用户意外覆盖彼此的数据,您需要use a transaction。
为防止用户故意覆盖彼此的数据,您需要use security rules。关键是使用您希望唯一的信息作为文档的 ID。
假设您通过日期和开始时间识别时间段,您可能有一个文档 ID "20210420T0900"
。如果用户试图写入该文档,而该文档已经存在,您可以在数据库的安全规则中拒绝该写入。
我面临着完全相同的问题,这是我目前最好的选择....
我需要所有预订的集合 (bookingscollection),无论日期、时间、预订的资源等如何。这个集合在我的 UI 的许多地方都可用,因为我列出了即将到来的预订等
我需要避免对这个集合进行写入,因为那里有重叠。
我正在考虑添加一个额外的集合,其中每个文档都描述了特定日期特定资源的预订(锁集合)。它可以是一个文档,包含资源 ID、它涵盖的日期和一组开始、停止预订时间。
然后在考虑向我的 bookingscollection 添加新预订时,我将对 lockcollection 中的相关文档进行事务处理,看看是否存在重叠,在这种情况下我会失败,如果没有,我会添加事务内锁定文档的新间隔。
一旦成功,我知道我可以简单地将预订添加到预订集合中,因为锁已经存在....
类似的逻辑将应用于删除或更改预订的过程。
这个想法对我来说是新的,但我想说说,所以我可以听到你的意见....?
我目前有一个 bookings
和一个 bookable
集合。 bookings
中的每个文档都包含一个日期范围(check-out
和 check-in
)和对 bookable
个文档的引用数组。
我对如何保证同一 bookables
的两个重叠 bookings
不会同时写入感到有点困惑。据我所知,我无法通过交易之类的方式
如有任何指点或建议,我们将不胜感激。
编辑:
假设 用户 A 想要预订与 用户 B 相同的两个项目,并且时间范围相同。他们几乎同时加载预订 UI 并确认他们的选择。
在为他们的每个请求在 bookings
集合中创建新文档之前,该应用程序将执行获取查询以检查是否存在任何重叠,如果 none 存在则插入新的预订文档.应用程序检查 booking
集合中的重叠与创建新文档之间的那部分时间似乎会导致 window 不一致(例如,可能允许两个文档具有重叠的时间范围和项目待创建)。
基于集合中符合特定条件的其他文档的存在,事务是否可以帮助防止将新文档写入该集合?
为防止用户意外覆盖彼此的数据,您需要use a transaction。
为防止用户故意覆盖彼此的数据,您需要use security rules。关键是使用您希望唯一的信息作为文档的 ID。
假设您通过日期和开始时间识别时间段,您可能有一个文档 ID "20210420T0900"
。如果用户试图写入该文档,而该文档已经存在,您可以在数据库的安全规则中拒绝该写入。
我面临着完全相同的问题,这是我目前最好的选择....
我需要所有预订的集合 (bookingscollection),无论日期、时间、预订的资源等如何。这个集合在我的 UI 的许多地方都可用,因为我列出了即将到来的预订等
我需要避免对这个集合进行写入,因为那里有重叠。
我正在考虑添加一个额外的集合,其中每个文档都描述了特定日期特定资源的预订(锁集合)。它可以是一个文档,包含资源 ID、它涵盖的日期和一组开始、停止预订时间。
然后在考虑向我的 bookingscollection 添加新预订时,我将对 lockcollection 中的相关文档进行事务处理,看看是否存在重叠,在这种情况下我会失败,如果没有,我会添加事务内锁定文档的新间隔。
一旦成功,我知道我可以简单地将预订添加到预订集合中,因为锁已经存在....
类似的逻辑将应用于删除或更改预订的过程。
这个想法对我来说是新的,但我想说说,所以我可以听到你的意见....?