From 117bdd2e3f6180a492e21b34f282d27e8c1147af Mon Sep 17 00:00:00 2001 From: xbgmsharp Date: Sun, 12 Nov 2023 13:01:46 +0100 Subject: [PATCH] Update ERD diagram to be dynamic --- ERD/README.md | 13 ++- ERD/postgsail.mmd | 245 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 251 insertions(+), 7 deletions(-) create mode 100644 ERD/postgsail.mmd diff --git a/ERD/README.md b/ERD/README.md index ba11934..ae48699 100644 --- a/ERD/README.md +++ b/ERD/README.md @@ -2,34 +2,33 @@ The Entity-Relationship Diagram (ERD) provides a graphical representation of database tables, columns, and inter-relationships. ERD can give sufficient information for the database administrator to follow when developing and maintaining the database. ## A global overview -![API Schema](https://raw.githubusercontent.com/xbgmsharp/postgsail/main/ERD/postgsail.pgerd.png "API Schema") +Auto generated Mermaid diagram using [mermerd](https://github.com/KarnerTh/mermerd) and [MermaidJs](https://github.com/mermaid-js/mermaid). + +[PostgSail Schema](https://raw.githubusercontent.com/xbgmsharp/postgsail/main/ERD/postgsail.mmd "PostgSail Schema") ## Further There is 3 main schemas: -- API Schema ERD +- API Schema: - tables - metrics - logbook - ... - functions - ... -![API Schema](https://raw.githubusercontent.com/xbgmsharp/postgsail/main/ERD/signalk%20-%20api.png) -- Auth Schema ERD +- Auth Schema: - tables - accounts - vessels - ... - functions - ... -![Auth Schema](https://raw.githubusercontent.com/xbgmsharp/postgsail/main/ERD/signalk%20-%20auth.png "Auth Schema") -- Public Schema ERD +- Public Schema: - tables - app_settings - tpl_messages - ... - functions - ... -![Public Schema](https://raw.githubusercontent.com/xbgmsharp/postgsail/main/ERD/signalk%20-%20public.png "Public Schema") diff --git a/ERD/postgsail.mmd b/ERD/postgsail.mmd new file mode 100644 index 0000000..639af66 --- /dev/null +++ b/ERD/postgsail.mmd @@ -0,0 +1,245 @@ +```mermaid +erDiagram + api_logbook { + text _from + double_precision _from_lat + double_precision _from_lng + integer _from_moorage_id "Link api.moorages with api.logbook via FOREIGN KEY and REFERENCES" + timestamp_without_time_zone _from_time "{NOT_NULL}" + text _to + double_precision _to_lat + double_precision _to_lng + integer _to_moorage_id "Link api.moorages with api.logbook via FOREIGN KEY and REFERENCES" + timestamp_without_time_zone _to_time + boolean active + double_precision avg_speed + numeric distance "in NM" + interval duration + jsonb extra "computed signalk metrics of interest, runTime, currentLevel, etc" + integer id "{NOT_NULL}" + double_precision max_speed + double_precision max_wind_speed + text name + text notes + geography track_geog "postgis geography type default SRID 4326 Unit: degres" + jsonb track_geojson "store generated geojson with track metrics data using with LineString and Point features, we can not depend api.metrics table" + geometry track_geom "postgis geometry type EPSG:4326 Unit: degres" + text vessel_id "{NOT_NULL}" + } + + api_metadata { + boolean active "trigger monitor online/offline" + boolean active + double_precision beam + text client_id + timestamp_without_time_zone created_at "{NOT_NULL}" + double_precision height + integer id "{NOT_NULL}" + double_precision length + numeric mmsi + text name + text plugin_version "{NOT_NULL}" + numeric ship_type + text signalk_version "{NOT_NULL}" + timestamp_without_time_zone time "{NOT_NULL}" + timestamp_without_time_zone updated_at "{NOT_NULL}" + text vessel_id "Link auth.vessels with api.metadata via FOREIGN KEY and REFERENCES {NOT_NULL}" + text vessel_id "{NOT_NULL}" + } + + api_metrics { + double_precision anglespeedapparent + text client_id + double_precision courseovergroundtrue + double_precision latitude "With CONSTRAINT but allow NULL value to be ignored silently by trigger" + double_precision longitude "With CONSTRAINT but allow NULL value to be ignored silently by trigger" + jsonb metrics + double_precision speedoverground + status status "" + timestamp_without_time_zone time "{NOT_NULL}" + text vessel_id "{NOT_NULL}" + double_precision windspeedapparent + } + + api_moorages { + text country + geography geog "postgis geography type default SRID 4326 Unit: degres" + boolean home_flag + integer id "{NOT_NULL}" + double_precision latitude + double_precision longitude + text name + jsonb nominatim + text notes + jsonb overpass + integer reference_count + integer stay_code "Link api.stays_at with api.moorages via FOREIGN KEY and REFERENCES" + interval stay_duration "Best to use standard ISO 8601" + text vessel_id "{NOT_NULL}" + } + + api_stays { + boolean active + timestamp_without_time_zone arrived "{NOT_NULL}" + timestamp_without_time_zone departed + interval duration "Best to use standard ISO 8601" + geography geog "postgis geography type default SRID 4326 Unit: degres" + integer id "{NOT_NULL}" + double_precision latitude + double_precision longitude + integer moorage_id "Link api.moorages with api.stays via FOREIGN KEY and REFERENCES" + text name + text notes + integer stay_code + text vessel_id "{NOT_NULL}" + } + + api_stays_at { + text description "{NOT_NULL}" + integer stay_code "{NOT_NULL}" + } + + auth_accounts { + timestamp_without_time_zone connected_at "{NOT_NULL}" + timestamp_without_time_zone created_at "{NOT_NULL}" + citext email "{NOT_NULL}" + text first "User first name with CONSTRAINT CHECK {NOT_NULL}" + text last "User last name with CONSTRAINT CHECK {NOT_NULL}" + text pass "{NOT_NULL}" + jsonb preferences + integer public_id "User public_id to allow mapping for anonymous access, could be use as well for as Grafana orgId {NOT_NULL}" + name role "{NOT_NULL}" + timestamp_without_time_zone updated_at "{NOT_NULL}" + text user_id "{NOT_NULL}" + } + + auth_otp { + character_varying otp_pass "{NOT_NULL}" + timestamp_without_time_zone otp_timestamp + smallint otp_tries "{NOT_NULL}" + citext user_email "{NOT_NULL}" + } + + auth_vessels { + timestamp_without_time_zone created_at "{NOT_NULL}" + numeric mmsi + text name "{NOT_NULL}" + citext owner_email "{NOT_NULL}" + name role "{NOT_NULL}" + timestamp_without_time_zone updated_at "{NOT_NULL}" + text vessel_id "{NOT_NULL}" + } + + public_aistypes { + text description + numeric id + } + + public_app_settings { + text name "application settings name key {NOT_NULL}" + text value "application settings value {NOT_NULL}" + } + + public_badges { + text description + text name + } + + public_email_templates { + text email_content + text email_subject + text name + text pushover_message + text pushover_title + } + + public_geocoders { + text name + text reverse_url + text url + } + + public_iso3166 { + text alpha_2 + text alpha_3 + text country + integer id + } + + public_mid { + text country + integer country_id + numeric id + } + + public_ne_10m_geography_marine_polys { + text changed + text featurecla + geometry geom + integer gid "{NOT_NULL}" + text label + double_precision max_label + double_precision min_label + text name + text name_ar + text name_bn + text name_de + text name_el + text name_en + text name_es + text name_fa + text name_fr + text name_he + text name_hi + text name_hu + text name_id + text name_it + text name_ja + text name_ko + text name_nl + text name_pl + text name_pt + text name_ru + text name_sv + text name_tr + text name_uk + text name_ur + text name_vi + text name_zh + text name_zht + text namealt + bigint ne_id + text note + smallint scalerank + text wikidataid + } + + public_process_queue { + text channel "{NOT_NULL}" + integer id "{NOT_NULL}" + text payload "{NOT_NULL}" + timestamp_without_time_zone processed + text ref_id "either user_id or vessel_id {NOT_NULL}" + timestamp_without_time_zone stored "{NOT_NULL}" + } + + public_spatial_ref_sys { + character_varying auth_name + integer auth_srid + character_varying proj4text + integer srid "{NOT_NULL}" + character_varying srtext + } + + api_logbook }o--|| api_metadata : "" + api_logbook }o--|| api_moorages : "" + api_logbook }o--|| api_moorages : "" + api_metadata }o--|| auth_vessels : "" + api_metrics }o--|| api_metadata : "" + api_moorages }o--|| api_metadata : "" + api_stays }o--|| api_metadata : "" + api_moorages }o--|| api_stays_at : "" + api_stays }o--|| api_moorages : "" + auth_otp |o--|| auth_accounts : "" + auth_vessels |o--|| auth_accounts : "" +``` \ No newline at end of file