Nozbe/WatermelonDB

☂️ Moving towards fast deletes

Open

#384 opened on Jun 20, 2019

View on GitHub
 (8 comments) (2 reactions) (0 assignees)JavaScript (9,633 stars) (570 forks)batch import
good first issuehelp wanted

Description

This is to fix: https://github.com/Nozbe/WatermelonDB/issues/186

Right now, deleting records is not very efficient in WatermelonDB.

Say you have models like this: Blog has_many Post has_many Comment. If you want to delete a blog post, you also have to delete all its posts, and all their comments. This happens one-by-one currently. What we need is the ability to efficiently (and atomically if possible) delete the whole tree in one go.

This needs some work and we need Community help (your help!) to achieve this:

  • Step 1: Implement prepareMarkAsDelete / prepareDestroyPermanently on batch - https://github.com/Nozbe/WatermelonDB/pull/294
  • Step 2: Implement Model.experimental_markAsDelete() / Model.experimental_destroyPermanently(), which will iterate over model's associations and for each belongs_to relationship, for each of them fetch() record's children, and then repeat for each of those children — and when we get to leafs of the tree, execute a batch with markAsDelete/destroyPermanently for all of these. The point is to have a new method that automatically deletes the whole tree — so that the user doesn't have to manually override the delete methods
  • Step 3: Improve the above's performance, so that instead of calling fetch() on each child'd children collection (e.g. when deleting a Blog, we don't fetch each post's comment collection), we collect all child IDs and make a query to fetch all records of a given type all at once (e.g. we fetch blog's posts, and then we fetch all comments whose post_id is one of the ids of posts we fetched)
  • Step 4: Continue improving performance by not actually fetching the whole children tree, but only fetching their IDs, and making sure to check collections' caches to delete from JS the records that are already cached.
  • Step 5: Improve API: deprecate old methods, rename new methods, consider having a single delete({ permanently: boolean }) method, consider adding an association flag to skip deleting certain children, consider adding a supportsFastDelete = false Model flag if necessary, etc.

Contributor guide

☂️ Moving towards fast deletes · Nozbe/WatermelonDB#384 | Good First Issue