Hi couch experts

I will describe my reasons and my proposed solution for realising a
database per "project". I have found a lot of information on "a database
per user". But non on a database per "project".
Please tell me if this is a sane way to go.

**************

The app:

In my app's users will mainly work together on projects. Collecting data
and geodata. In the field.

Projects can be configured: Users, data structure, pixel-map-files for
offline mapping (large attachments). This will happen online.

Collecting data will happen in the field, so often offline.

The app uses couchdb on the server. And pouchdb in the browser.

**************

Why a database per project:

Let's assume five users work together on a project. A database per user
would increase the data amount on the server by a factor 5. And also the
syncing. As this is the normal scenario, it makes more sense to create
databases for projects.

**************

My idea on how to implement "a database per project":

On the server there is a central couchdb database. It's main job is user
management, as all the project data will be in other databases.

On the server there is also a node.js app that manages databases per
projects:
- it watches the change stream for new projects being created (using nano).
Then:
- it creates a new database for the project
  - database-name is the _id of the project
- it sets read (and hence write) permissions to users with role = _id of
the project
- it copies the projects users (whose names are contained in an array of
the project object) from the central couch into the new database
- it adds a new role to the projects users in the central couch
  - this role equals the _id of the project

Client side, the app listens to the changes feed. When the active user's
_users-object is changed, it checks it's roles:
- if a role has been deleted, the corresponding project is removed and
syncing stopped
- if a role has been added, the corresponding project is added and syncing
added

**************

o.k.
What do you think?

Reply via email to