Content
Updated by Andreas Pfohl 5 months ago
# Data architecture for hierarchical attributes ### Requirements
## Context and Problem Statement
What is the data architecture for serving a hierarchy of tag with associated metadata to an OpenProject custom field implementation?
## Decision Drivers
* The data architecture needs to structure tags in a hierarchical way (like a tree), where each tag has associated metadata.
* The structure can change at any point in time.
* Changes to the structure need to be recorded throughout the life-time.
* The data architecture must be capable to be used for filtering based on given tags.
* When the hierarchical structure changes, it must be possible to update pointers to it (the custom field).
* When the hierarchical structure changes, it must be possible to to let pointers point to "older" versions of the structure.
* Changes to the structure must be auditable.
## Considered Options
* Event sourced structure
* Using paper trails
* No historic data is captured
## Decision Outcome
Chosen option: "{title of option 1}", because {justification. e.g., only option, which meets k.o. criterion decision driver | which resolves force {force} | … | comes out best (see below)}.
### Consequences
* Good, because {positive consequence, e.g., improvement of one or more desired qualities, …}
* Bad, because {negative consequence, e.g., compromising one or more desired qualities, …}
* …
### Confirmation
{Describe how the implementation of/compliance with the ADR is confirmed. E.g., by a review or an ArchUnit test. Although we classify this element as optional, it is included in most ADRs.}
## Pros and Cons of the Options
### Event sourced structure
{example | description | pointer to more information | …}
* Good, because {argument a}
* Good, because {argument b}
* Neutral, because {argument c}
* Bad, because {argument d}
* …
### Using paper trails
{example | description | pointer to more information | …}
* Good, because {argument a}
* Good, because {argument b}
* Neutral, because {argument c}
* Bad, because {argument d}
* …
### No historic data is captured
{example | description | pointer to more information | …}
* Good, because {argument a}
* Good, because {argument b}
* Neutral, because {argument c}
* Bad, because {argument d}
* …
## More Information
{You might want to provide additional evidence/confidence for the decision outcome here and/or document the team agreement on the decision and/or define when/how this decision the decision should be realized and if/when it should be re-visited. Links to other decisions and resources might appear here as well.}
### ~~Requirements~~
* ~~The structure must be able represent a tree, where every node has metadata, too.~~ too.
* ~~Historical data~~ Historical data
* ~~If If the hierarchy is changed, it will result in conflict with already assigned values~~ values
* ~~We We must be able to preserve historical value assignments, which also need access to the historical hierarchy~~ hierarchy
* ~~We We must be able to update conflicting value assignments -> Important: auditability (journals)~~ (journals)
* ~~Filtering Filtering must be able to find values based on historical hierarchies (filter query language needed?)~~ needed?)
### ~~IMPORTANT~~ IMPORTANT
* ~~we we need to document all decisions, as there will be some heavy lifters~~ lifters
## Context and Problem Statement
What is the data architecture for serving a hierarchy of tag with associated metadata to an OpenProject custom field implementation?
## Decision Drivers
* The data architecture needs to structure tags in a hierarchical way (like a tree), where each tag has associated metadata.
* The structure can change at any point in time.
* Changes to the structure need to be recorded throughout the life-time.
* The data architecture must be capable to be used for filtering based on given tags.
* When the hierarchical structure changes, it must be possible to update pointers to it (the custom field).
* When the hierarchical structure changes, it must be possible to to let pointers point to "older" versions of the structure.
* Changes to the structure must be auditable.
## Considered Options
* Event sourced structure
* Using paper trails
* No historic data is captured
## Decision Outcome
Chosen option: "{title of option 1}", because {justification. e.g., only option, which meets k.o. criterion decision driver | which resolves force {force} | … | comes out best (see below)}.
### Consequences
* Good, because {positive consequence, e.g., improvement of one or more desired qualities, …}
* Bad, because {negative consequence, e.g., compromising one or more desired qualities, …}
* …
### Confirmation
{Describe how the implementation of/compliance with the ADR is confirmed. E.g., by a review or an ArchUnit test. Although we classify this element as optional, it is included in most ADRs.}
## Pros and Cons of the Options
### Event sourced structure
{example | description | pointer to more information | …}
* Good, because {argument a}
* Good, because {argument b}
* Neutral, because {argument c}
* Bad, because {argument d}
* …
### Using paper trails
{example | description | pointer to more information | …}
* Good, because {argument a}
* Good, because {argument b}
* Neutral, because {argument c}
* Bad, because {argument d}
* …
### No historic data is captured
{example | description | pointer to more information | …}
* Good, because {argument a}
* Good, because {argument b}
* Neutral, because {argument c}
* Bad, because {argument d}
* …
## More Information
{You might want to provide additional evidence/confidence for the decision outcome here and/or document the team agreement on the decision and/or define when/how this decision the decision should be realized and if/when it should be re-visited. Links to other decisions and resources might appear here as well.}
### ~~Requirements~~
* ~~The structure must be able represent a tree, where every node has metadata, too.~~
* ~~Historical data~~
* ~~If
* ~~We
* ~~We
* ~~Filtering
### ~~IMPORTANT~~
* ~~we