airbnb/caravel

View on GitHub
scripts/erd/erd.puml

Summary

Maintainability
Test Coverage

@startuml erd

title Apache Superset ERD

!theme blueprint

' avoid problems with angled crows feet

skinparam linetype ortho
skinparam classBorderColor #grey

skinparam classBorderColor<<new>> #white
skinparam classBorderThickness<<new>> 1
skinparam classLineStyle<<new>> Dashed
skinparam ClassBackgroundColor<<new>> #204143

' Models
rectangle "Data Assets" #black {
        entity "SqlMetric (sql_metrics)" as sql_metrics {
            uuid: BINARY(16)
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            metric_name: VARCHAR(255)
            verbose_name: VARCHAR(1024)
            metric_type: VARCHAR(32)
            description: TEXT
            d3format: VARCHAR(128)
            currency: VARCHAR(128)
            warning_text: TEXT
            table_id: INTEGER
            expression: TEXT
            extra: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "DatabaseUserOAuth2Tokens (database_user_oauth2_tokens)" as database_user_oauth2_tokens {
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            user_id: INTEGER
            database_id: INTEGER
            access_token: BLOB
            access_token_expiration: DATETIME
            refresh_token: BLOB
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "Table (sl_tables)" as sl_tables {
            uuid: BINARY(16)
            created_on: DATETIME
            changed_on: DATETIME
            extra_json: TEXT
            id: INTEGER
            database_id: INTEGER
            catalog: TEXT
            schema: TEXT
            name: TEXT
            is_managed_externally: BOOLEAN
            external_url: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "Database (dbs)" as dbs {
            uuid: BINARY(16)
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            verbose_name: VARCHAR(250)
            database_name: VARCHAR(250)
            sqlalchemy_uri: VARCHAR(1024)
            password: BLOB
            cache_timeout: INTEGER
            select_as_create_table_as: BOOLEAN
            expose_in_sqllab: BOOLEAN
            configuration_method: VARCHAR(255)
            allow_run_async: BOOLEAN
            allow_file_upload: BOOLEAN
            allow_ctas: BOOLEAN
            allow_cvas: BOOLEAN
            allow_dml: BOOLEAN
            force_ctas_schema: VARCHAR(250)
            extra: TEXT
            encrypted_extra: BLOB
            impersonate_user: BOOLEAN
            server_cert: BLOB
            is_managed_externally: BOOLEAN
            external_url: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "Dataset (sl_datasets)" as sl_datasets {
            uuid: BINARY(16)
            created_on: DATETIME
            changed_on: DATETIME
            extra_json: TEXT
            id: INTEGER
            database_id: INTEGER
            is_physical: BOOLEAN
            is_managed_externally: BOOLEAN
            name: TEXT
            expression: TEXT
            external_url: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "SqlaTable (tables)" as tables {
            uuid: BINARY(16)
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            description: TEXT
            default_endpoint: TEXT
            is_featured: BOOLEAN
            filter_select_enabled: BOOLEAN
            offset: INTEGER
            cache_timeout: INTEGER
            params: VARCHAR(1000)
            perm: VARCHAR(1000)
            schema_perm: VARCHAR(1000)
            is_managed_externally: BOOLEAN
            external_url: TEXT
            table_name: VARCHAR(250)
            main_dttm_col: VARCHAR(250)
            database_id: INTEGER
            fetch_values_predicate: TEXT
            schema: VARCHAR(255)
            sql: TEXT
            is_sqllab_view: BOOLEAN
            template_params: TEXT
            extra: TEXT
            normalize_columns: BOOLEAN
            always_filter_main_dttm: BOOLEAN
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "TableColumn (table_columns)" as table_columns {
            uuid: BINARY(16)
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            column_name: VARCHAR(255)
            verbose_name: VARCHAR(1024)
            is_active: BOOLEAN
            type: TEXT
            advanced_data_type: VARCHAR(255)
            groupby: BOOLEAN
            filterable: BOOLEAN
            description: TEXT
            table_id: INTEGER
            is_dttm: BOOLEAN
            expression: TEXT
            python_date_format: VARCHAR(255)
            extra: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "Column (sl_columns)" as sl_columns {
            uuid: BINARY(16)
            created_on: DATETIME
            changed_on: DATETIME
            extra_json: TEXT
            id: INTEGER
            is_additive: BOOLEAN
            is_aggregation: BOOLEAN
            is_filterable: BOOLEAN
            is_dimensional: BOOLEAN
            is_increase_desired: BOOLEAN
            is_managed_externally: BOOLEAN
            is_partition: BOOLEAN
            is_physical: BOOLEAN
            is_spatial: BOOLEAN
            is_temporal: BOOLEAN
            name: TEXT
            type: TEXT
            advanced_data_type: TEXT
            expression: TEXT
            unit: TEXT
            description: TEXT
            warning_text: TEXT
            external_url: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "RowLevelSecurityFilter (row_level_security_filters)" as row_level_security_filters {
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            name: VARCHAR(255)
            description: TEXT
            filter_type: VARCHAR(7)
            group_key: VARCHAR(255)
            clause: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        }
rectangle "System" #black {
        entity "KeyValueEntry (key_value)" as key_value {
            uuid: BINARY(16)
            id: INTEGER
            resource: VARCHAR(32)
            value: BLOB
            created_on: DATETIME
            created_by_fk: INTEGER
            changed_on: DATETIME
            expires_on: DATETIME
            changed_by_fk: INTEGER
        }
        entity "SSHTunnel (ssh_tunnels)" as ssh_tunnels {
            uuid: BINARY(16)
            created_on: DATETIME
            changed_on: DATETIME
            extra_json: TEXT
            id: INTEGER
            database_id: INTEGER
            server_address: TEXT
            server_port: INTEGER
            username: BLOB
            password: BLOB
            private_key: BLOB
            private_key_password: BLOB
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "KeyValue (keyvalue)" as keyvalue {
            id: INTEGER
            value: TEXT
        }
        entity "CacheKey (cache_keys)" as cache_keys {
            id: INTEGER
            cache_key: VARCHAR(256)
            cache_timeout: INTEGER
            datasource_uid: VARCHAR(64)
            created_on: DATETIME
        }
        entity "Log (logs)" as logs {
            id: INTEGER
            action: VARCHAR(512)
            user_id: INTEGER
            dashboard_id: INTEGER
            slice_id: INTEGER
            json: TEXT
            dttm: DATETIME
            duration_ms: INTEGER
            referrer: VARCHAR(1024)
        }
        }
rectangle "SQL Lab" #black {
        entity "SavedQuery (saved_query)" as saved_query {
            uuid: BINARY(16)
            created_on: DATETIME
            changed_on: DATETIME
            extra_json: TEXT
            id: INTEGER
            user_id: INTEGER
            db_id: INTEGER
            schema: VARCHAR(128)
            label: VARCHAR(256)
            description: TEXT
            sql: TEXT
            template_parameters: TEXT
            rows: INTEGER
            last_run: DATETIME
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "TableSchema (table_schema)" as table_schema {
            created_on: DATETIME
            changed_on: DATETIME
            extra_json: TEXT
            id: INTEGER
            tab_state_id: INTEGER
            database_id: INTEGER
            schema: VARCHAR(256)
            table: VARCHAR(256)
            description: TEXT
            expanded: BOOLEAN
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "Query (query)" as query {
            tracking_url: TEXT
            extra_json: TEXT
            id: INTEGER
            client_id: VARCHAR(11)
            database_id: INTEGER
            tmp_table_name: VARCHAR(256)
            tmp_schema_name: VARCHAR(256)
            user_id: INTEGER
            status: VARCHAR(16)
            tab_name: VARCHAR(256)
            sql_editor_id: VARCHAR(256)
            schema: VARCHAR(256)
            sql: TEXT
            select_sql: TEXT
            executed_sql: TEXT
            limit: INTEGER
            limiting_factor: VARCHAR(18)
            select_as_cta: BOOLEAN
            select_as_cta_used: BOOLEAN
            ctas_method: VARCHAR(16)
            progress: INTEGER
            rows: INTEGER
            error_message: TEXT
            results_key: VARCHAR(64)
            start_time: NUMERIC(20, 6)
            start_running_time: NUMERIC(20, 6)
            end_time: NUMERIC(20, 6)
            end_result_backend_time: NUMERIC(20, 6)
            changed_on: DATETIME
        }
        entity "TabState (tab_state)" as tab_state {
            created_on: DATETIME
            changed_on: DATETIME
            extra_json: TEXT
            id: INTEGER
            user_id: INTEGER
            label: VARCHAR(256)
            active: BOOLEAN
            database_id: INTEGER
            schema: VARCHAR(256)
            sql: TEXT
            query_limit: INTEGER
            latest_query_id: INTEGER
            autorun: BOOLEAN
            template_params: TEXT
            hide_left_bar: BOOLEAN
            saved_query_id: INTEGER
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        }
rectangle "Core" #black {
        entity "FavStar (favstar)" as favstar {
            id: INTEGER
            user_id: INTEGER
            class_name: VARCHAR(50)
            obj_id: INTEGER
            dttm: DATETIME
        }
        entity "Dashboard (dashboards)" as dashboards {
            uuid: BINARY(16)
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            dashboard_title: VARCHAR(500)
            position_json: TEXT
            description: TEXT
            css: TEXT
            certified_by: TEXT
            certification_details: TEXT
            json_metadata: TEXT
            slug: VARCHAR(255)
            published: BOOLEAN
            is_managed_externally: BOOLEAN
            external_url: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "Annotation (annotation)" as annotation {
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            start_dttm: DATETIME
            end_dttm: DATETIME
            layer_id: INTEGER
            short_descr: VARCHAR(500)
            long_descr: TEXT
            json_metadata: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "EmbeddedDashboard (embedded_dashboards)" as embedded_dashboards {
            created_on: DATETIME
            changed_on: DATETIME
            uuid: BINARY(16)
            allow_domain_list: TEXT
            dashboard_id: INTEGER
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "Slice (slices)" as slices {
            uuid: BINARY(16)
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            slice_name: VARCHAR(250)
            datasource_id: INTEGER
            datasource_type: VARCHAR(200)
            datasource_name: VARCHAR(2000)
            viz_type: VARCHAR(250)
            params: TEXT
            query_context: TEXT
            description: TEXT
            cache_timeout: INTEGER
            perm: VARCHAR(1000)
            schema_perm: VARCHAR(1000)
            last_saved_at: DATETIME
            last_saved_by_fk: INTEGER
            certified_by: TEXT
            certification_details: TEXT
            is_managed_externally: BOOLEAN
            external_url: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "TaggedObject (tagged_object)" as tagged_object {
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            tag_id: INTEGER
            object_id: INTEGER
            object_type: VARCHAR(9)
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "AnnotationLayer (annotation_layer)" as annotation_layer {
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            name: VARCHAR(250)
            descr: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "DynamicPlugin (dynamic_plugin)" as dynamic_plugin {
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            name: TEXT
            key: TEXT
            bundle_url: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "Tag (tag)" as tag {
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            name: VARCHAR(250)
            type: VARCHAR(12)
            description: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "CssTemplate (css_templates)" as css_templates {
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            template_name: VARCHAR(250)
            css: TEXT
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "UserAttribute (user_attribute)" as user_attribute {
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            user_id: INTEGER
            welcome_dashboard_id: INTEGER
            avatar_url: VARCHAR(100)
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        }
rectangle "Inherited from Flask App Builder (FAB)" #black {
        entity "ViewMenu (ab_view_menu)" as ab_view_menu {
            id: INTEGER
            name: VARCHAR(250)
        }
        entity "Permission (ab_permission)" as ab_permission {
            id: INTEGER
            name: VARCHAR(100)
        }
        entity "User (ab_user)" as ab_user {
            id: INTEGER
            first_name: VARCHAR(64)
            last_name: VARCHAR(64)
            username: VARCHAR(64)
            password: VARCHAR(256)
            active: BOOLEAN
            email: VARCHAR(320)
            last_login: DATETIME
            login_count: INTEGER
            fail_login_count: INTEGER
            created_on: DATETIME
            changed_on: DATETIME
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "RegisterUser (ab_register_user)" as ab_register_user {
            id: INTEGER
            first_name: VARCHAR(64)
            last_name: VARCHAR(64)
            username: VARCHAR(64)
            password: VARCHAR(256)
            email: VARCHAR(64)
            registration_date: DATETIME
            registration_hash: VARCHAR(256)
        }
        entity "PermissionView (ab_permission_view)" as ab_permission_view {
            id: INTEGER
            permission_id: INTEGER
            view_menu_id: INTEGER
        }
        entity "Role (ab_role)" as ab_role {
            id: INTEGER
            name: VARCHAR(64)
        }
        }
rectangle "Alerts & Reports" #black {
        entity "ReportRecipients (report_recipient)" as report_recipient {
            created_on: DATETIME
            changed_on: DATETIME
            id: INTEGER
            type: VARCHAR(50)
            recipient_config_json: TEXT
            report_schedule_id: INTEGER
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        entity "ReportExecutionLog (report_execution_log)" as report_execution_log {
            id: INTEGER
            uuid: BINARY(16)
            scheduled_dttm: DATETIME
            start_dttm: DATETIME
            end_dttm: DATETIME
            value: FLOAT
            value_row_json: TEXT
            state: VARCHAR(50)
            error_message: TEXT
            report_schedule_id: INTEGER
        }
        entity "ReportSchedule (report_schedule)" as report_schedule {
            created_on: DATETIME
            changed_on: DATETIME
            extra_json: TEXT
            id: INTEGER
            type: VARCHAR(50)
            name: VARCHAR(150)
            description: TEXT
            context_markdown: TEXT
            active: BOOLEAN
            crontab: VARCHAR(1000)
            creation_method: VARCHAR(255)
            timezone: VARCHAR(100)
            report_format: VARCHAR(50)
            sql: TEXT
            chart_id: INTEGER
            dashboard_id: INTEGER
            database_id: INTEGER
            last_eval_dttm: DATETIME
            last_state: VARCHAR(50)
            last_value: FLOAT
            last_value_row_json: TEXT
            validator_type: VARCHAR(100)
            validator_config_json: TEXT
            log_retention: INTEGER
            grace_period: INTEGER
            working_timeout: INTEGER
            force_screenshot: BOOLEAN
            custom_width: INTEGER
            custom_height: INTEGER
            created_by_fk: INTEGER
            changed_by_fk: INTEGER
        }
        }
' Relationships

    sql_metrics }|--|| tables
    sql_metrics }|--|| ab_user

    database_user_oauth2_tokens }|--|| ab_user
    database_user_oauth2_tokens }|--|| dbs

    sl_tables }|--|| dbs
    sl_tables }|--|{ sl_columns
    sl_tables }|--|| ab_user
    sl_tables }|--|{ sl_datasets

    dbs }|--|| ab_user
    dbs ||--|{ tables
    dbs ||--|{ sl_datasets

    sl_datasets }|--|{ sl_columns
    sl_datasets }|--|{ ab_user

    tables ||--|{ table_columns
    tables }|--|{ row_level_security_filters

    table_columns }|--|| ab_user

    sl_columns }|--|| ab_user

    row_level_security_filters }|--|| ab_user

    key_value }|--|| ab_user

    ssh_tunnels }|--|| dbs
    ssh_tunnels }|--|| ab_user




    saved_query }|--|| ab_user
    saved_query }|--|| dbs
    saved_query }|--|{ tag

    table_schema }|--|| dbs
    table_schema }|--|| ab_user
    table_schema }|--|| tab_state

    query }|--|| dbs
    query }|--|| ab_user

    tab_state }|--|| dbs
    tab_state }|--|| query
    tab_state }|--|| saved_query
    tab_state }|--|| ab_user


    dashboards }|--|{ slices
    dashboards }|--|{ ab_user
    dashboards }|--|{ tag
    dashboards }|--|{ ab_role
    dashboards ||--|{ embedded_dashboards
    dashboards ||--|{ report_schedule

    annotation }|--|| annotation_layer
    annotation }|--|| ab_user

    embedded_dashboards }|--|| ab_user

    slices }|--|| ab_user
    slices }|--|{ tag
    slices }|--|| tables
    slices ||--|{ report_schedule

    tagged_object }|--|| tag
    tagged_object }|--|| ab_user

    annotation_layer }|--|| ab_user

    dynamic_plugin }|--|| ab_user

    tag }|--|{ ab_user

    css_templates }|--|| ab_user

    user_attribute }|--|| dashboards



    ab_user }|--|{ ab_role
    ab_user }|--|| ab_user
    ab_user ||--|{ logs
    ab_user ||--|{ user_attribute
    ab_user }|--|{ tables


    ab_permission_view }|--|| ab_permission
    ab_permission_view }|--|| ab_view_menu
    ab_permission_view }|--|{ ab_role

    ab_role }|--|{ row_level_security_filters

    report_recipient }|--|| report_schedule
    report_recipient }|--|| ab_user

    report_execution_log }|--|| report_schedule

    report_schedule }|--|| dbs
    report_schedule }|--|{ ab_user
@enduml