hOLper Data ModelΒΆ

        %%{init: { class: { useMaxWidth: false }}}%%
classDiagram
    direction LR

    class Category {
        +Integer category_id
        +Integer race_id
        +Integer event_category_id
        +Enum status
        +Interval time_offset
        +SmallInteger vacancies_before
        +SmallInteger vacancies_after
        +SmallInteger starter_limit
    }
    Category "*" -- "" Race : race / categories
    Category --> "" EventCategory : event_category
    Category "" -- "*" CategoryCourseAssignment : courses / category
    Category "" -- "*" Start : starts / category

    class CategoryCourseAssignment {
        +Integer category_id
        +SmallInteger leg
        +Integer course_id
    }
    CategoryCourseAssignment "*" -- "" Course : course / categories

    class Competitor {
        +Integer competitor_id
        +Integer entry_id
        +SmallInteger entry_sequence
        +SmallInteger leg_number
        +SmallInteger leg_order
        +Integer person_id
        +Integer organisation_id
    }
    Competitor "*" -- "" Entry : entry / competitors
    Competitor --> "" Person : person
    Competitor --> "0..1" Organisation : organisation
    Competitor --> "*" ControlCard : control_cards
    Competitor "" -- "*" CompetitorStart : starts / competitor
    Competitor "" -- "*" CompetitorXID : external_ids / competitor

    class CompetitorResult {
        +Integer competitor_result_id
        +DateTime start_time
        +DateTime finish_time
        +Interval time_adjustment
        +Interval time
        +Enum status
    }
    CompetitorResult "" -- "" CompetitorStart : competitor_start / competitor_result

    class CompetitorStart {
        +Integer competitor_start_id
        +Integer start_id
        +Integer competitor_id
        +Interval time_offset
        +Integer control_card_id
    }
    CompetitorStart "*" -- "" Start : start / competitor_starts
    CompetitorStart --> "0..1" ControlCard : control_card

    class CompetitorXID {
        +String issuer
        +String external_id
        +Integer competitor_id
    }

    class Control {
        +Integer control_id
        +Integer race_id
        +String label
    }
    Control "*" -- "" Race : race / controls

    class ControlCard {
        +Integer control_card_id
        +Enum system
        +String label
    }

    class Country {
        +Integer country_id
        +String name
        +String iso_alpha_2
        +String iso_alpha_3
        +String ioc_code
    }

    class Course {
        +Integer course_id
        +Integer race_id
        +String name
        +Float length
        +Float climb
    }
    Course "*" -- "" Race : race / courses
    Course "" -- "*" CourseControl : controls / course

    class CourseControl {
        +Integer course_control_id
        +Integer course_id
        +Integer control_id
        +Float leg_length
        +Float leg_climb
        +Enum type
        +Float score
        +Integer order
        +Integer after_course_control_id
        +Integer before_course_control_id
    }
    CourseControl --> "" Control : control
    CourseControl --> "0..1" CourseControl : after
    CourseControl --> "0..1" CourseControl : before

    class Entry {
        +Integer entry_id
        +Integer event_id
        +Integer number
        +String name
        +Integer organisation_id
    }
    Entry "*" -- "" Event : event / entries
    Entry --> "0..1" Organisation : organisation
    Entry "" -- "*" EntryCategoryRequest : category_requests / entry
    Entry --> "*" StartTimeAllocationRequest : start_time_allocation_requests
    Entry "" -- "*" Start : starts / entry
    Entry "" -- "*" EntryXID : external_ids / entry

    class EntryCategoryRequest {
        +Integer entry_id
        +SmallInteger preference
        +Integer event_category_id
    }
    EntryCategoryRequest "*" -- "" EventCategory : event_category / entry_requests

    class EntryXID {
        +String issuer
        +String external_id
        +Integer entry_id
    }

    class Event {
        +Integer event_id
        +String name
        +DateTime start_time
        +DateTime end_time
        +Enum form
    }
    Event "" -- "*" Race : races / event
    Event "0..1" -- "*" EventCategory : event_categories / event
    Event "" -- "*" EventXID : external_ids / event

    class EventCategory {
        +Integer event_category_id
        +Integer event_id
        +String name
        +String short_name
        +Enum status
        +SmallInteger min_age
        +SmallInteger max_age
        +Enum sex
        +SmallInteger min_number_of_team_members
        +SmallInteger max_number_of_team_members
        +SmallInteger min_team_age
        +SmallInteger max_team_age
        +SmallInteger starter_limit
    }
    EventCategory "" -- "*" Leg : legs / event_category
    EventCategory "" -- "*" EventCategoryXID : external_ids / event_category

    class EventCategoryXID {
        +String issuer
        +String external_id
        +Integer event_category_id
    }

    class EventXID {
        +String issuer
        +String external_id
        +Integer event_id
    }

    class Leg {
        +Integer leg_id
        +Integer event_category_id
        +SmallInteger leg_number
        +SmallInteger min_number_of_competitors
        +SmallInteger max_number_of_competitors
    }

    class Organisation {
        +Integer organisation_id
        +String name
        +String short_name
        +Integer country_id
        +Enum type
    }
    Organisation --> "0..1" Country : country
    Organisation "" -- "*" OrganisationXID : external_ids / organisation

    class OrganisationXID {
        +String issuer
        +String external_id
        +Integer organisation_id
    }

    class Person {
        +Integer person_id
        +String title
        +String family_name
        +String given_name
        +Date birth_date
        +Integer country_id
        +Enum sex
    }
    Person --> "0..1" Country : country
    Person "" -- "*" PersonXID : external_ids / person

    class PersonXID {
        +String issuer
        +String external_id
        +Integer person_id
    }

    class Race {
        +Integer race_id
        +Integer event_id
        +TIMESTAMP first_start
    }

    class Result {
        +Integer result_id
        +DateTime start_time
        +DateTime finish_time
        +Interval time_adjustment
        +Interval time
        +Enum status
        +Integer position
    }
    Result "" -- "" Start : start / result

    class Start {
        +Integer start_id
        +Integer category_id
        +Integer entry_id
        +Boolean competitive
        +Interval time_offset
    }

    class StartTimeAllocationRequest {
        +Integer start_time_allocation_request_id
        +Integer entry_id
        +Enum type
        +Integer organisation_id
        +Integer person_id
    }
    StartTimeAllocationRequest "*" -- "" Entry : entry / start_time_allocation_requests
    StartTimeAllocationRequest --> "0..1" Organisation : organisation
    StartTimeAllocationRequest --> "0..1" Person : person