智慧水务管理系统 - 精河县供水工程综合管理平台

init.sql 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. -- Water Management System Database Initialization
  2. -- Create database if not exists
  3. CREATE DATABASE IF NOT EXISTS water_management;
  4. -- Connect to the database
  5. \c water_management;
  6. -- Create user with permissions
  7. DO $$
  8. BEGIN
  9. IF NOT EXISTS (SELECT FROM pg_user WHERE usename = 'water_user') THEN
  10. CREATE USER water_user WITH PASSWORD 'water_pass';
  11. END IF;
  12. END
  13. $$;
  14. -- Grant permissions
  15. GRANT ALL PRIVILEGES ON DATABASE water_management TO water_user;
  16. -- Grant all privileges on all tables in the public schema
  17. GRANT ALL ON ALL TABLES IN SCHEMA public TO water_user;
  18. GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO water_user;
  19. GRANT ALL ON ALL FUNCTIONS IN SCHEMA public TO water_user;
  20. -- Create PostGIS extension for spatial data
  21. CREATE EXTENSION IF NOT EXISTS postgis;
  22. -- Create IoT schema
  23. CREATE SCHEMA IF NOT EXISTS iot;
  24. -- Set default schema to iot
  25. SET search_path TO iot, public;
  26. -- Create device models table
  27. CREATE TABLE IF NOT EXISTS iot_device_models (
  28. id BIGSERIAL PRIMARY KEY,
  29. model_code VARCHAR(100) NOT NULL UNIQUE,
  30. model_name VARCHAR(200) NOT NULL,
  31. device_type VARCHAR(50) NOT NULL,
  32. protocol VARCHAR(50) NOT NULL,
  33. description TEXT,
  34. is_active BOOLEAN NOT NULL DEFAULT true,
  35. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  36. updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
  37. );
  38. -- Create device instances table
  39. CREATE TABLE IF NOT EXISTS iot_device_instances (
  40. id BIGSERIAL PRIMARY KEY,
  41. device_id VARCHAR(100) NOT NULL UNIQUE,
  42. device_model_id BIGINT NOT NULL REFERENCES iot_device_models(id),
  43. name VARCHAR(200) NOT NULL,
  44. location VARCHAR(500),
  45. is_active BOOLEAN NOT NULL DEFAULT true,
  46. last_seen_at TIMESTAMP,
  47. registered_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  48. device_info JSONB,
  49. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  50. updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
  51. );
  52. -- Create device shadows table
  53. CREATE TABLE IF NOT EXISTS iot_device_shadows (
  54. id BIGSERIAL PRIMARY KEY,
  55. device_id BIGINT NOT NULL REFERENCES iot_device_instances(id),
  56. shadow_state JSONB NOT NULL DEFAULT '{}',
  57. desired_state JSONB DEFAULT '{}',
  58. reported_state JSONB DEFAULT '{}',
  59. version BIGINT NOT NULL DEFAULT 1,
  60. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  61. updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  62. UNIQUE(device_id)
  63. );
  64. -- Create telemetry data table
  65. CREATE TABLE IF NOT EXISTS iot_telemetry (
  66. id BIGSERIAL PRIMARY KEY,
  67. device_id VARCHAR(100) NOT NULL,
  68. timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  69. telemetry_data JSONB NOT NULL,
  70. device_model_id BIGINT REFERENCES iot_device_models(id),
  71. processed BOOLEAN NOT NULL DEFAULT false,
  72. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
  73. );
  74. -- Create index for better performance
  75. CREATE INDEX IF NOT EXISTS idx_device_instances_device_id ON iot_device_instances(device_id);
  76. CREATE INDEX IF NOT EXISTS idx_device_instances_model_id ON iot_device_instances(device_model_id);
  77. CREATE INDEX IF NOT EXISTS idx_device_shadows_device_id ON iot_device_shadows(device_id);
  78. CREATE INDEX IF NOT EXISTS idx_telemetry_device_id ON iot_telemetry(device_id);
  79. CREATE INDEX IF NOT EXISTS idx_telemetry_timestamp ON iot_telemetry(timestamp);
  80. -- Insert sample device models
  81. INSERT INTO iot_device_models (model_code, model_name, device_type, protocol, description, is_active)
  82. VALUES
  83. ('TEMP-001', 'Temperature Sensor', 'temperature', 'modbus', 'Temperature monitoring sensor', true),
  84. ('PRESSURE-001', 'Pressure Sensor', 'pressure', 'modbus', 'Pressure monitoring sensor', true),
  85. ('FLOW-001', 'Flow Meter', 'flow', 'modbus', 'Water flow measurement', true)
  86. ON CONFLICT (model_code) DO NOTHING;
  87. -- Insert sample device instances
  88. INSERT INTO iot_device_instances (device_id, device_model_id, name, location, is_active, device_info)
  89. VALUES
  90. ('TEMP-001-001', 1, 'Main Temperature Sensor', 'Main Pump Room', true, '{"installation_date": "2026-01-15", "calibration_date": "2026-06-01"}'),
  91. ('PRESSURE-001-001', 2, 'Main Pressure Sensor', 'Distribution Center', true, '{"installation_date": "2026-01-15", "calibration_date": "2026-06-01"}')
  92. ON CONFLICT (device_id) DO NOTHING;
  93. -- Create spatial table for device locations if needed
  94. CREATE TABLE IF NOT EXISTS iot_device_locations (
  95. id BIGSERIAL PRIMARY KEY,
  96. device_id VARCHAR(100) NOT NULL UNIQUE,
  97. location_name VARCHAR(200) NOT NULL,
  98. coordinates GEOMETRY(POINT, 4326),
  99. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  100. updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
  101. );
  102. -- Insert sample spatial data
  103. INSERT INTO iot_device_locations (device_id, location_name, coordinates)
  104. VALUES
  105. ('TEMP-001-001', 'Main Pump Room', ST_MakePoint(44.2614, 84.2936)),
  106. ('PRESSURE-001-001', 'Distribution Center', ST_MakePoint(44.2605, 84.2942))
  107. ON CONFLICT (device_id) DO NOTHING;
  108. -- Grant permissions on all tables in iot schema
  109. GRANT ALL ON ALL TABLES IN SCHEMA iot TO water_user;
  110. GRANT ALL ON ALL SEQUENCES IN SCHEMA iot TO water_user;
  111. GRANT ALL ON ALL FUNCTIONS IN SCHEMA iot TO water_user;
  112. -- Refresh materialized views if any
  113. -- REFRESH MATERIALIZED VIEW IF EXISTS iot_device_summary;