Files
CM95/sql/001_schema_mysql57.sql
2026-09-02 09:50:12 +08:00

282 lines
11 KiB
SQL

SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS chart_dataset (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
source_type VARCHAR(16) NOT NULL DEFAULT 'CM93',
name VARCHAR(255) NOT NULL,
source_root TEXT NOT NULL,
source_fingerprint CHAR(64) NULL,
parser_version VARCHAR(32) NOT NULL,
normalized_srid INT UNSIGNED NOT NULL DEFAULT 4326,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY idx_dataset_source_type (source_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS chart_dictionary_object (
dataset_id BIGINT UNSIGNED NOT NULL,
object_class_id SMALLINT UNSIGNED NOT NULL,
object_class VARCHAR(16) NOT NULL,
geometry_code VARCHAR(8) NULL,
display_code VARCHAR(8) NULL,
description VARCHAR(255) NULL,
raw_line TEXT NOT NULL,
PRIMARY KEY (dataset_id, object_class_id),
KEY idx_dict_object_class (object_class),
CONSTRAINT fk_dict_object_dataset FOREIGN KEY (dataset_id)
REFERENCES chart_dataset(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS chart_dictionary_attribute (
dataset_id BIGINT UNSIGNED NOT NULL,
attribute_id SMALLINT UNSIGNED NOT NULL,
attribute_name VARCHAR(16) NOT NULL,
source_type_name VARCHAR(32) NOT NULL,
decoder_type CHAR(1) NOT NULL,
min_value DOUBLE NULL,
max_value DOUBLE NULL,
raw_line TEXT NOT NULL,
PRIMARY KEY (dataset_id, attribute_id),
KEY idx_dict_attribute_name (attribute_name),
CONSTRAINT fk_dict_attr_dataset FOREIGN KEY (dataset_id)
REFERENCES chart_dataset(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS chart_cell (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
dataset_id BIGINT UNSIGNED NOT NULL,
source_relative_path VARCHAR(1024) NOT NULL,
source_file_name VARCHAR(255) NOT NULL,
source_size BIGINT UNSIGNED NOT NULL,
source_sha256 CHAR(64) NULL,
scale_code CHAR(1) NOT NULL,
native_scale INT UNSIGNED NOT NULL,
cell_name VARCHAR(64) NOT NULL,
prolog_word0 INT UNSIGNED NULL,
table1_length BIGINT UNSIGNED NULL,
table2_length BIGINT UNSIGNED NULL,
easting_min DOUBLE NULL,
northing_min DOUBLE NULL,
easting_max DOUBLE NULL,
northing_max DOUBLE NULL,
bbox_min_lon DOUBLE NULL,
bbox_min_lat DOUBLE NULL,
bbox_max_lon DOUBLE NULL,
bbox_max_lat DOUBLE NULL,
vector_record_count INT UNSIGNED NULL,
vector_point_count BIGINT UNSIGNED NULL,
point2d_count INT UNSIGNED NULL,
point3d_count INT UNSIGNED NULL,
feature_count INT UNSIGNED NULL,
attribute_count BIGINT UNSIGNED NULL,
import_status ENUM('DISCOVERED','IMPORTING','DONE','FAILED') NOT NULL DEFAULT 'DISCOVERED',
error_message TEXT NULL,
imported_at DATETIME NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uq_cell_dataset_path (dataset_id, source_relative_path(255)),
KEY idx_cell_scale (dataset_id, scale_code),
KEY idx_cell_status (dataset_id, import_status),
CONSTRAINT fk_cell_dataset FOREIGN KEY (dataset_id)
REFERENCES chart_dataset(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS chart_coverage (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
dataset_id BIGINT UNSIGNED NOT NULL,
cell_id BIGINT UNSIGNED NOT NULL,
source_record_index INT UNSIGNED NOT NULL,
object_class_id SMALLINT UNSIGNED NOT NULL,
compilation_scale INT UNSIGNED NULL,
horizontal_datum INT NULL,
vertical_datum INT NULL,
wgsox DOUBLE NULL,
wgsoy DOUBLE NULL,
attributes_json JSON NULL,
geom GEOMETRY NOT NULL,
geometry_repaired TINYINT(1) NOT NULL DEFAULT 0,
geometry_issue VARCHAR(255) NULL,
PRIMARY KEY (id),
UNIQUE KEY uq_cov_cell_record (cell_id, source_record_index),
KEY idx_cov_cell (cell_id),
SPATIAL KEY spx_cov_geom (geom),
CONSTRAINT fk_cov_dataset FOREIGN KEY (dataset_id)
REFERENCES chart_dataset(id) ON DELETE CASCADE,
CONSTRAINT fk_cov_cell FOREIGN KEY (cell_id)
REFERENCES chart_cell(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS chart_feature (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
dataset_id BIGINT UNSIGNED NOT NULL,
cell_id BIGINT UNSIGNED NOT NULL,
coverage_id BIGINT UNSIGNED NULL,
source_record_index INT UNSIGNED NOT NULL,
object_class_id SMALLINT UNSIGNED NULL,
object_class VARCHAR(16) NOT NULL,
geometry_type ENUM('POINT','LINE','AREA','SOUNDING','META','UNKNOWN') NOT NULL,
scale_code CHAR(1) NOT NULL,
native_scale INT UNSIGNED NOT NULL,
raw_geotype SMALLINT UNSIGNED NULL,
normalized_srid INT UNSIGNED NOT NULL DEFAULT 4326,
bbox_min_lon DOUBLE NULL,
bbox_min_lat DOUBLE NULL,
bbox_max_lon DOUBLE NULL,
bbox_max_lat DOUBLE NULL,
attributes_json JSON NULL,
raw_feature_blob MEDIUMBLOB NULL,
raw_attribute_blob MEDIUMBLOB NULL,
geometry_repaired TINYINT(1) NOT NULL DEFAULT 0,
geometry_issue VARCHAR(255) NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uq_feature_cell_record (cell_id, source_record_index),
KEY idx_feature_class (dataset_id, object_class),
KEY idx_feature_scale (dataset_id, native_scale),
KEY idx_feature_cell (cell_id),
KEY idx_feature_coverage (coverage_id),
CONSTRAINT fk_feature_dataset FOREIGN KEY (dataset_id)
REFERENCES chart_dataset(id) ON DELETE CASCADE,
CONSTRAINT fk_feature_cell FOREIGN KEY (cell_id)
REFERENCES chart_cell(id) ON DELETE CASCADE,
CONSTRAINT fk_feature_coverage FOREIGN KEY (coverage_id)
REFERENCES chart_coverage(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS chart_feature_attribute (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
feature_id BIGINT UNSIGNED NOT NULL,
ordinal_no SMALLINT UNSIGNED NOT NULL,
attribute_id SMALLINT UNSIGNED NOT NULL,
attribute_name VARCHAR(16) NOT NULL,
value_type ENUM('BYTE','INT','LONG','REAL','WORD10','STRING','LIST','COMPLEX','UNKNOWN') NOT NULL,
value_int BIGINT NULL,
value_real DOUBLE NULL,
value_text TEXT NULL,
value_json JSON NULL,
raw_value_blob BLOB NULL,
PRIMARY KEY (id),
UNIQUE KEY uq_feature_attr_ordinal (feature_id, ordinal_no),
KEY idx_feature_attr_name (attribute_name),
KEY idx_feature_attr_id (attribute_id),
CONSTRAINT fk_feature_attr_feature FOREIGN KEY (feature_id)
REFERENCES chart_feature(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS chart_point_geometry (
feature_id BIGINT UNSIGNED NOT NULL,
geom POINT NOT NULL,
PRIMARY KEY (feature_id),
SPATIAL KEY spx_point_geom (geom),
CONSTRAINT fk_point_feature FOREIGN KEY (feature_id)
REFERENCES chart_feature(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS chart_line_geometry (
feature_id BIGINT UNSIGNED NOT NULL,
geom GEOMETRY NOT NULL,
PRIMARY KEY (feature_id),
SPATIAL KEY spx_line_geom (geom),
CONSTRAINT fk_line_feature FOREIGN KEY (feature_id)
REFERENCES chart_feature(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS chart_area_geometry (
feature_id BIGINT UNSIGNED NOT NULL,
geom GEOMETRY NOT NULL,
PRIMARY KEY (feature_id),
SPATIAL KEY spx_area_geom (geom),
CONSTRAINT fk_area_feature FOREIGN KEY (feature_id)
REFERENCES chart_feature(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS chart_sounding_point (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
feature_id BIGINT UNSIGNED NOT NULL,
point_index INT UNSIGNED NOT NULL,
raw_x INT UNSIGNED NOT NULL,
raw_y INT UNSIGNED NOT NULL,
raw_z INT UNSIGNED NOT NULL,
depth DOUBLE NOT NULL,
geom POINT NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY uq_sounding_feature_point (feature_id, point_index),
KEY idx_sounding_depth (depth),
SPATIAL KEY spx_sounding_geom (geom),
CONSTRAINT fk_sounding_feature FOREIGN KEY (feature_id)
REFERENCES chart_feature(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS chart_raw_record (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
cell_id BIGINT UNSIGNED NOT NULL,
record_kind ENUM('HEADER','VECTOR','POINT2D','POINT3D','FEATURE','ATTRIBUTE','OTHER') NOT NULL,
source_record_index INT UNSIGNED NOT NULL DEFAULT 0,
raw_blob MEDIUMBLOB NOT NULL,
raw_metadata_json JSON NULL,
PRIMARY KEY (id),
KEY idx_raw_cell_kind (cell_id, record_kind, source_record_index),
CONSTRAINT fk_raw_cell FOREIGN KEY (cell_id)
REFERENCES chart_cell(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS chart_import_job (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
dataset_id BIGINT UNSIGNED NOT NULL,
status ENUM('RUNNING','DONE','FAILED','CANCELLED') NOT NULL DEFAULT 'RUNNING',
started_at DATETIME NOT NULL,
finished_at DATETIME NULL,
cells_discovered INT UNSIGNED NOT NULL DEFAULT 0,
cells_done INT UNSIGNED NOT NULL DEFAULT 0,
cells_failed INT UNSIGNED NOT NULL DEFAULT 0,
features_source BIGINT UNSIGNED NOT NULL DEFAULT 0,
features_imported BIGINT UNSIGNED NOT NULL DEFAULT 0,
attributes_source BIGINT UNSIGNED NOT NULL DEFAULT 0,
attributes_imported BIGINT UNSIGNED NOT NULL DEFAULT 0,
unknown_object_count BIGINT UNSIGNED NOT NULL DEFAULT 0,
unknown_attribute_count BIGINT UNSIGNED NOT NULL DEFAULT 0,
geometry_invalid_count BIGINT UNSIGNED NOT NULL DEFAULT 0,
geometry_repaired_count BIGINT UNSIGNED NOT NULL DEFAULT 0,
summary_json JSON NULL,
PRIMARY KEY (id),
KEY idx_job_dataset (dataset_id, started_at),
CONSTRAINT fk_job_dataset FOREIGN KEY (dataset_id)
REFERENCES chart_dataset(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS chart_import_event (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
job_id BIGINT UNSIGNED NULL,
cell_id BIGINT UNSIGNED NULL,
level ENUM('DEBUG','INFO','WARNING','ERROR') NOT NULL,
event_code VARCHAR(64) NOT NULL,
message TEXT NOT NULL,
details_json JSON NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY idx_event_job (job_id, id),
KEY idx_event_cell (cell_id, id),
KEY idx_event_code (event_code),
CONSTRAINT fk_event_job FOREIGN KEY (job_id)
REFERENCES chart_import_job(id) ON DELETE CASCADE,
CONSTRAINT fk_event_cell FOREIGN KEY (cell_id)
REFERENCES chart_cell(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;