diff options
Diffstat (limited to 'docs/tradeoffs.md')
-rw-r--r-- | docs/tradeoffs.md | 36 |
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 | ||