Referencing and Relationships
This document covers advanced schema features in Drafta, including object references and modular data structures.
Schema References
Drafta schemas can reference other objects using the $ symbol, allowing for modular and reusable data structures. This reference syntax can also be applied to arrays, enabling you to reference multiple objects in a single field. Cross-referenced objects must be defined within the same schema file.
Field Reference
A field can reference another object's field using the $ symbol:
UserProfile:
phone_number: $Contact.phone_number
Contact:
phone_number: string
Here, phone_number in UserProfile refers to phone_number in Contact.
Object Reference
A field can reference an entire object:
UserProfile:
home_address: $Address
Address:
street: string
city: string
zip: string
state: string
This allows home_address to be structured as an Address object.
Array of References
Fields can reference multiple objects using an array:
UserProfile:
addresses: [$Address]
Here, addresses holds multiple Address objects.
Recursive Object Reference
Drafta supports recursive object references, where an object can reference itself directly or indirectly. The system automatically detects and handles recursion to prevent infinite loops.
Example:
Category:
name: string
parent: $Category
In this case, parent allows a category to reference another category, enabling hierarchical structures.
Mutual Object References
Drafta also supports mutual references, where two objects reference each other. This is useful for modeling relationships such as users following each other or linked entities.
Example:
User:
name: string
best_friend: $User
company: $Company
Company:
name: string
owner: $User
Here:
best_friendinUserreferences anotherUser, allowing bidirectional relationships.companyinUserreferences aCompany.ownerinCompanyreferences aUser, establishing a mutual reference.