Skip to content

Data Model

Base Classes

All entities inherit audit fields. Aggregate roots additionally get a project-scoped sequence number for public identification.

Entity (base)

FieldTypeNotes
IdGuid (UUIDv7)Internal only, never exposed to users
CreatedAtDateTimeAuto-set on insert
CreatedByGuidAuto-set from current user
UpdatedAtDateTimeAuto-set on insert and update
UpdatedByGuidAuto-set from current user

AggregateRoot : Entity

FieldTypeNotes
SequenceNumberintProject-scoped public ID (the "42" in VNO-42)

Entities

Project (Aggregate Root)

FieldTypeNotes
Namestring
Descriptionstring
KeystringUnique across platform, used in public IDs (e.g., "VNO")
Visibilityenumpublic, unlisted, private
Themevalue objectprimaryColor, accentColor
NextSequenceNumberintAtomic DB-side counter for public ID generation
OwnerUserIdGuid

ProjectMember (Entity)

FieldTypeNotes
ProjectIdGuidFK to Project
UserIdGuidFK to User
Roleenumowner, storyteller, co-creator, player, viewer
Statusenumpending, accepted, declined, revoked, removed, left
InvitedByGuidUserId of who sent the invitation
InvitedAtDateTime
JoinedAtDateTime?Null until accepted

TimelineUpdate (Aggregate Root)

FieldTypeNotes
ProjectIdGuidFK to Project
Titlestring
Colorenumred, blue, green, purple, amber
Statusenumpublished, in-development, concept, legacy
OrderintFor drag-and-drop reordering

Section (Entity)

FieldTypeNotes
TimelineUpdateIdGuidFK to TimelineUpdate
Labelstring
OrderintFor reordering within a timeline update

Item (Entity)

FieldTypeNotes
SectionIdGuidFK to Section
Namestring
Descriptionstring?
Urlstring?External link for published content
IsPendingboolPlanned but not named yet
OrderintFor reordering within a section
ParentItemIdGuid?Self-referencing FK for sub-items

Character (Aggregate Root)

FieldTypeNotes
ProjectIdGuidFK to Project
Namestring
Descriptionstring
ImageUrlstring?
Typeenumpc, npc
Visibilityenumpublic, private
MetadatajsonbFlexible custom fields (clan, generation, class, etc.)

Relationship (Entity)

FieldTypeNotes
ProjectIdGuidFK to Project
SourceCharacterIdGuidFK to Character
TargetCharacterIdGuidFK to Character
Typeenumfamily, social, professional, supernatural, custom
Subtypestringe.g., parent, friend, sire, enemy
Strengthint1-5
Statusenumactive, ended, secret
IsBidirectionalboolIf true, queried from both sides
Descriptionstring?
Visibilityenumpublic, private

Faction (Aggregate Root)

FieldTypeNotes
ProjectIdGuidFK to Project
Namestring
Descriptionstring
Typeenumpolitical, military, religious, criminal, other
SymbolUrlstring?
ParentFactionIdGuid?Self-referencing FK for nested factions

FactionMembership (Entity)

FieldTypeNotes
FactionIdGuidFK to Faction
CharacterIdGuidFK to Character
Rankstring?Role/rank within the faction

FactionRelationship (Entity)

FieldTypeNotes
ProjectIdGuidFK to Project
SourceFactionIdGuidFK to Faction
TargetFactionIdGuidFK to Faction
Typeenumallied, enemy, neutral, trade, vassal, custom
Strengthint1-5
IsSecretbool
Descriptionstring?

ChangelogEntry (Entity)

FieldTypeNotes
TimelineUpdateIdGuidFK to TimelineUpdate
DateDateTime
Titlestring
Descriptionstring?
NewItemsstring[]?List of added items
UpdatedItemsstring[]?List of updated items
RemovedItemsstring[]?List of removed items

Value Objects

Theme

  • PrimaryColor: string (hex)
  • AccentColor: string (hex)

RelationshipType

  • Category: enum (family, social, professional, supernatural, custom)
  • Subtype: string

DevelopmentStatus

  • Value: enum (published, in-development, concept, legacy)

Entity Classification

TypeEntities
Aggregate RootsProject, Character, Faction, TimelineUpdate
EntitiesSection, Item, ProjectMember, FactionMembership, Relationship, FactionRelationship, ChangelogEntry
Value ObjectsTheme, RelationshipType, DevelopmentStatus