summaryrefslogtreecommitdiffstats
path: root/docs/tradeoffs.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/tradeoffs.md')
-rw-r--r--docs/tradeoffs.md36
1 files changed, 36 insertions, 0 deletions
diff --git a/docs/tradeoffs.md b/docs/tradeoffs.md
new file mode 100644
index 0000000..d0e32c1
--- /dev/null
+++ b/docs/tradeoffs.md
@@ -0,0 +1,36 @@
1# Tradeoffs/Design Decisions
2* Key-Value store instead of relational
3 * `+` Schemaless, easier to evolve
4 * `-` No need to fully normalize the data in order to make it queriable. And without full normalization SQL is not really useful and bad performance wise.
5 * `-` We need to maintain our own indexes
6
7* Individual store per resource
8 * Storage format defined by resource individually
9 * `-` Each resource needs to define it's own schema
10 * `+` Resources can adjust storage format to map well on what it has to synchronize
11 * `+` Synchronization state can directly be embedded into messages
12 * `+` Individual resources could switch to another store technology
13 * `+` Easier maintenance
14 * `+` Resource is only responsible for it's own store and doesn't accidentaly break another resources store
15 * `-` Inter`-`resource moves are both more complicated and more expensive from a client perspective
16 * `+` Inter`-`resource moves become simple additions and removals from a resource perspective
17 * `-` No system`-`wide unique id per message (only resource/id tuple identifies a message uniquely)
18 * `+` Stores can work fully concurrently (also for writing)
19
20* Indexes defined and maintained by resources
21 * `-` Relational queries accross resources are expensive (depending on the query perhaps not even feasible)
22 * `-` Each resource needs to define it's own set of indexes
23 * `+` Flexible design as it allows to change indexes on a per resource level
24 * `+` Indexes can be optimized towards resources main usecases
25 * `+` Indexes can be shared with the source (IMAP serverside threading)
26
27* Shared domain types as common interface for client applications
28 * `-` yet another abstraction layer that requires translation to other layers and maintenance
29 * `+` decoupling of domain logic from data access
30 * `+` allows to evolve types according to needs (not coupled to specific application domain types)
31
32# Risks
33* key-value store does not perform with large amounts of data
34* query performance is not sufficient
35* turnaround time for modifications is too high to feel responsive
36* design turns out similarly complex as Akonadi