#+TITLE: Domino Features & Roadmap
* Extended Relational Model (RM/T)
:PROPERTIES:
:CATEGORY: semantic-modeling
:END:
An extended relational database engine based on E. F. Codd's RM/T (1979).
Captures more meaning through entity types, surrogates, and molecular semantics.
** Implemented Features
*** DONE Content-Addressed Storage
CLOSED: [2025-01-21]
- [X] SHA-256 surrogates for all entities
- [X] System-controlled entity identifiers (E-domain)
- [X] Automatic deduplication via content addressing
- [X] Immutable data structures
*** DONE Entity Types (E-Relations)
CLOSED: [2025-01-21]
- [X] Kernel entity types (database, relation)
- [X] E-relations for entity existence assertion
- [X] Surrogate-based entity identification
- [X] Entity integrity enforcement
*** DONE Property Relations (P-Relations)
CLOSED: [2025-01-21]
- [X] Immediate property storage
- [X] Single-valued property support
- [X] Property integrity (Rule 4)
- [X] Foreign key references via surrogates
*** DONE Merkle Tree Integration
CLOSED: [2025-01-21]
- [X] Relations as Merkle trees
- [X] Database state versioning
- [X] Efficient state diffing
- [X] Content-addressed relation hashing
*** DONE Volcano Iterator Model
CLOSED: [2025-01-21]
- [X] Lazy tuple evaluation
- [X] Process-based iterators
- [X] Message-passing protocol
- [X] Memory-bounded queries
*** DONE Transactional Operations
CLOSED: [2025-01-21]
- [X] ACID guarantees via Mnesia
- [X] Atomic tuple insertion
- [X] Tuple retraction with transactions
- [X] Relation clear and retract operations
*** DONE Comprehensive Test Suite
CLOSED: [2025-01-21]
- [X] Database creation tests
- [X] Relation and tuple operations
- [X] Hash consistency validation
- [X] Iterator protocol tests
- [X] Retraction and truncate tests
- [X] Join operation tests
- [X] Provenance tracking tests
*** DONE Attribute-Level Provenance Tracking
CLOSED: [2025-01-22]
- [X] Nested metadata structure (meta.provenance)
- [X] Track immediate source of each attribute
- [X] Always enabled - every tuple includes metadata
- [X] Automatic provenance merging in joins
- [X] Conflict resolution for duplicate attributes
- [X] Clean separation of data attributes and metadata
- [X] Foundation for tuple-level lineage tracking (implemented)
** Planned RM/T Extensions
*** TODO Characteristic Entities
Multi-valued properties as subordinate entities.
- [ ] Characteristic entity types (C-relations)
- [ ] Characteristic graph (CG-relation)
- [ ] Characteristic tree hierarchy
- [ ] Characteristic integrity (Rule 5)
- [ ] Example: Job history as characteristic of Employee
*** TODO Associative Entities
Relationships as first-class entities with properties.
- [ ] Associative entity types (A-relations)
- [ ] Association graph (AG-relation)
- [ ] Association integrity (Rule 6)
- [ ] Higher-order associations
- [ ] Example: Assignment(employee, project, start_date)
*** TODO Generalization Hierarchies
Entity subtyping and inheritance.
- [ ] Unconditional gen inclusion (UGI-relation)
- [ ] Alternative gen inclusion (AGI-relation)
- [ ] Subtype integrity (Rule 7)
- [ ] Property inheritance
- [ ] Multiple inheritance support
- [ ] Example: Engineer/Secretary/Trucker subtypes of Employee
*** TODO Cover Aggregation
Collections and groupings.
- [ ] Cover membership relation (KG-relation)
- [ ] Cover entity types
- [ ] Dynamic membership
- [ ] Heterogeneous covers
- [ ] Example: Convoys, Teams, Departments
*** TODO Event Precedence
Temporal ordering and scripts.
- [ ] Event entity types (T-relations)
- [ ] Unconditional successor (US-relation)
- [ ] Alternative successor (AS-relation)
- [ ] Unconditional predecessor (UP-relation)
- [ ] Alternative predecessor (AP-relation)
- [ ] Example: Order → Shipment → Invoice
*** TODO Extended Operators
Operators for molecular semantics.
- [ ] OUTER NATURAL JOIN
- [ ] OUTER UNION
- [ ] OUTER THETA-JOIN
- [ ] MAYBE operators (null handling)
- [ ] Graph operators (OPEN, CLOSE, STEP)
*** TODO RM/T Catalog
Extensible schema catalog.
- [ ] CATR (relations catalog)
- [ ] CATRA (relation-attribute)
- [ ] CATA (attributes catalog)
- [ ] CATAD (attribute-domain)
- [ ] CATD (domains catalog)
- [ ] CATC (categories catalog)
- [ ] CATRC (relation-category)
*** TODO Property Graph (PG-relation)
Link P-relations to E-relations.
- [ ] Property molecule types
- [ ] Dynamic property schema
- [ ] Property graph traversal
** Classical Relational Algebra
*** TODO Selection (σ)
Filter tuples by predicate.
- [ ] THETA-SELECT with comparison operators
- [ ] Support for <, ≤, =, ≥, >, ≠
- [ ] TRUE and MAYBE versions (null handling)
*** TODO Projection (π)
Project relation onto subset of attributes.
- [ ] Remove specified columns
- [ ] Eliminate duplicate rows
- [ ] Preserve set semantics
*** TODO Cartesian Product (×)
Cross product of two relations.
- [ ] Unrestricted concatenation
- [ ] Basis for joins
*** DONE Natural Join (⋈)
CLOSED: [2025-01-22]
Join on common attributes.
- [X] Equi-join with duplicate removal (equijoin_iterator)
- [X] Nested loop join strategy
- [X] Attribute conflict resolution (right_ prefix)
- [X] Attribute-level provenance tracking
- [X] Comprehensive test coverage
*** DONE Theta Join (⋈θ)
CLOSED: [2025-01-22]
Join with arbitrary comparison.
- [X] Support all theta operators via predicate functions
- [X] Generalizes natural join
- [X] Nested loop join with custom predicates
- [X] Provenance merging from both sides
*** TODO Union (∪)
Set union of compatible relations.
- [ ] Union-compatible constraint
- [ ] Duplicate removal
*** TODO Intersection (∩)
Set intersection.
- [ ] Union-compatible constraint
*** TODO Difference (−)
Set difference.
- [ ] Union-compatible constraint
*** TODO Divide (÷)
Relational division.
- [ ] Algebraic universal quantifier
*** TODO Rename (ρ)
Attribute renaming.
- [ ] Enable self-joins
** Advanced Features
*** DONE Tuple-Level Lineage Tracking
CLOSED: [2025-01-23]
Track complete operational history of each tuple through query pipelines.
**** Status: IMPLEMENTED
**** API Usage
Metadata tracking is ALWAYS enabled. All tuples include the 'meta' field:
#+BEGIN_SRC erlang
%% Simple query (metadata automatically included)
Iter = operations:get_tuples_iterator(DB, employees, #{}).
%% With constraints (metadata still included)
Iter = operations:get_tuples_iterator(DB, employees,
#{constraints => #{age => {gt, 30}}}).
%% Results always have:
%% #{id => 1, name => "Alice",
%% meta => #{
%% provenance => #{id => {employees, id}, name => {employees, name}},
%% lineage => {base, employees}
%% }}
#+END_SRC
**** Provenance vs. Lineage
- *Provenance* (IMPLEMENTED): Tracks immediate source of each attribute
#+BEGIN_SRC erlang
meta => #{
provenance => #{
name => {employees, name},
dept_name => {departments, dept_name}
}
}
#+END_SRC
- *Lineage* (IMPLEMENTED): Tracks complete operation tree that created the tuple
#+BEGIN_SRC erlang
meta => #{
provenance => #{...}, % Attribute sources
lineage => {project, [name, dept_name],
{join, dept_id,
{select, fun(T) -> maps:get(age, T) > 30 end,
{base, employees}},
{base, departments}}}
}
#+END_SRC
**** Type Definition
#+BEGIN_SRC erlang
-type lineage_op() ::
{base, atom()} % Base relation
| {select, fun(), lineage_op()} % Filter operation
| {project, [atom()], lineage_op()} % Projection
| {join, atom(), lineage_op(), lineage_op()} % Join on attribute
| {theta_join, fun(), lineage_op(), lineage_op()} % Join with predicate
| {sort, fun(), lineage_op()} % Sort operation
| {take, pos_integer(), lineage_op()} % Limit operation
| {aggregate, atom(), atom(), lineage_op()}. % Aggregation (future)
#+END_SRC
**** Use Cases
- [ ] *Updatable Views*: Propagate updates back to base relations
- Example: =UPDATE view SET name = "Bob"= → trace lineage → =UPDATE employees SET name = "Bob"=
- [ ] *Incremental View Maintenance*: Identify affected tuples when base data changes
- Example: If employees tuple changes, lineage identifies which view tuples need recomputation
- [ ] *Audit Trails*: Track how sensitive data was transformed
- Example: "This salary came from: employees → join(departments) → aggregate(avg)"
- [ ] *Query Explanation*: Debug complex pipelines
- Example: "Why is this tuple here?" → inspect lineage to see operations applied
- [ ] *Provenance Queries*: Query the lineage itself
- Example: "Show all tuples derived from employees.id=5"
**** Implementation Plan
1. [X] Extend =tuple_metadata()= type with lineage field
2. [X] Add lineage construction to each iterator operator
- [X] select_iterator: ={select, Predicate, ChildLineage}=
- [X] project_iterator: ={project, Attributes, ChildLineage}=
- [X] equijoin_iterator: ={join, Attr, LeftLineage, RightLineage}=
- [X] theta_join_iterator: ={theta_join, Pred, LeftLineage, RightLineage}=
- [X] sort_iterator: ={sort, CompareFun, ChildLineage}=
- [X] take_iterator: ={take, N, ChildLineage}=
3. [X] Implement lineage merging in joins (combine operation trees)
4. [ ] Add lineage querying API for provenance analysis (future)
5. [ ] Use lineage for updatable view update propagation (future)
6. [X] Add comprehensive lineage tests
**** Relation to Existing Code
Relation-level provenance already exists in =#relation.provenance=:
#+BEGIN_SRC erlang
-type provenance() ::
{base, atom()}
| {join, provenance(), provenance()}
| {select, provenance(), constraints()}
| {project, provenance(), [atom()]}
| {take, provenance(), pos_integer()}.
#+END_SRC
This tracks where *relations* come from. Lineage is the *tuple-level*
equivalent, tracking operational history of individual tuples through
query pipelines.
**** Example: Complete Lineage Chain
#+BEGIN_SRC erlang
% Query: employees → select(age>30) → join(departments) → project([name, dept_name])
% Resulting tuple with full lineage:
#{name => "Alice",
dept_name => "Engineering",
meta => #{
provenance => #{
name => {employees, name},
dept_name => {departments, dept_name}
},
lineage => {
project, [name, dept_name],
{join, dept_id,
{select, fun(T) -> maps:get(age, T) > 30 end,
{base, employees}},
{base, departments}}}
}}
% From this lineage, we can:
% 1. Trace "Alice" back to employees.name
% 2. Know she passed the age>30 filter
% 3. See she was joined with departments on dept_id
% 4. Understand the projection removed other attributes
#+END_SRC
*** TODO Null Value Handling
Three-valued logic for incomplete information.
- [ ] "Value unknown" null type
- [ ] "Property inapplicable" null type
- [ ] E-null for "entity unknown"
- [ ] Null substitution principle
- [ ] MAYBE operators
*** TODO Infinite Relations (Aleph₀)
Countably infinite relation generators.
- [ ] Integer generator
- [ ] Arithmetic relations (plus, minus, multiply)
- [ ] Lazy evaluation with constraints
- [ ] Partially materialized storage
- [ ] User-defined generators
*** TODO View Integration
Merging multiple perspectives.
- [ ] View definition language
- [ ] Automatic view maintenance
- [ ] View update translation
*** TODO Temporal Support
Time-varying databases.
- [ ] Transaction time
- [ ] Valid time
- [ ] Bitemporal support
- [ ] Non-forgetting mode
*** TODO Distributed Synchronization
Merkle tree-based replication.
- [ ] Efficient diff protocol
- [ ] Conflict resolution
- [ ] Eventual consistency
** Developer Experience
*** TODO Query Language
High-level relational query language.
- [ ] Algebraic syntax
- [ ] Tuple calculus variant
- [ ] Domain calculus variant
*** TODO REPL Console
Interactive query environment.
- [ ] Live query evaluation
- [ ] Schema introspection
- [ ] Query history
*** TODO Visualization Tools
Graphical representation.
- [ ] Relation browser
- [ ] Join graph visualization
- [ ] Generalization hierarchy diagrams
- [ ] Query execution plans
*** TODO Org Babel Integration
Literate programming support.
- [ ] Execute relational queries in org-mode
- [ ] Export results to tables
- [ ] Reproducible analysis
** Documentation & Validation
*** DONE Code Documentation
CLOSED: [2025-01-21]
- [X] Module architecture overview
- [X] Data structure specifications
- [X] Usage examples
- [X] Implementation details
*** TODO Theoretical Validation
Ensure correctness.
- [ ] Formal proofs of operator properties
- [ ] Closure verification
- [ ] Idempotence tests
- [ ] Property-based testing with PropEr
- [ ] Comparison with Date & Darwen semantics
*** TODO Research Papers
Link to foundational theory.
- [ ] Codd 1970: "A Relational Model"
- [ ] Codd 1979: "Extending the Database Relational Model" (RM/T)
- [ ] Codd 1985: "Does AlOL Need the Relational Algebra?"
- [ ] Date & Darwen: "Foundation for Future Database Systems"
** References
- E. F. Codd (1979). "Extending the Database Relational Model to Capture More Meaning"
- E. F. Codd (1970). "A Relational Model of Data for Large Shared Data Banks"
- C. J. Date & Hugh Darwen. "Foundation for Future Database Systems: The Third Manifesto"