diff options
Diffstat (limited to '')
| -rw-r--r-- | docs/data-model.puml | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/docs/data-model.puml b/docs/data-model.puml new file mode 100644 index 0000000..59e2cff --- /dev/null +++ b/docs/data-model.puml @@ -0,0 +1,101 @@ +@startuml data-model +!theme plain +title Data Model Core Abstractions + +class attribute { + + hash: SHA256 + + value: term() +} + +class tuple { + + hash: SHA256 + + relation: atom() + + attribute_map: #{name => hash} +} + +class relation { + + hash: SHA256 + + name: atom() + + tree: merkle_tree() + + schema: #{attr => type_relation} + + constraints: constraints() + + cardinality: {finite, N} | aleph_zero | continuum + + generator: function() | undefined + + provenance: provenance() +} + +class type_relation { + + name: atom() + + erlang_type: type() + + membership_predicate: function() + + unfold_generator: function() + + cardinality: aleph_zero | continuum +} + +class database_state { + + hash: SHA256 + + name: atom() + + tree: merkle_tree() + + relations: #{name => hash} + + type_relations: #{name => type_relation} + + timestamp: integer() +} + +database_state "1" *-- "many" relation : contains +database_state "1" *-- "many" type_relation : defines types +relation "1" *-- "many" tuple : contains +tuple "1" *-- "many" attribute : references +relation --> type_relation : schema references + +note right of attribute + Content-Addressed Storage: + - SHA-256 hash of value + - Automatic deduplication + - Immutable once stored + + Value Validation: + Value must be member of + type relation specified in schema +end note + +note right of relation + Storage Strategy: + - Finite: Merkle tree (materialized) + - Infinite: Generator (lazy) + + Type Relations: + - Primitives: natural, integer, real, string + - Composite: views over other relations +end note + +note left of type_relation + **Schema Philosophy:** + Attributes are typed by type relations (not primitives). + Types are relations (stored as infinite relations). + Schema validation = membership checking. + + **Type Relations are Relations:** + They define domains via: + 1. Erlang type constraint + 2. Additional predicates + 3. Unfold generator for enumeration + + Examples: + - natural[X] :- integer[X], X >= 0 + - complex[X] :- X is (A,B), real[A], real[B] +end note + +note bottom of database_state + **Schema Example:** + employee relation schema: + #{ + name => non_empty_string, % type relation + age => natural, % type relation + salary => positive_integer % type relation + } + + Each schema value is a reference to a type relation, + NOT a primitive type string like "integer" +end note + +@enduml |
