Этот документ является третьим в разделе «Моделирование данных временных рядов». Компания YMatrix считает, что проектирование модели данных напрямую влияет на ценность потребления и использования данных. Поэтому помимо технических объяснений весь этот раздел призван дать вам четкое понимание моделей данных временных рядов — их концепций, областей применения и эволюции.
Примечание!
Данный документ служит лишь примером для справки. Перед началом формального проектирования модели рекомендуется внимательно ознакомиться с архитектурой YMatrix и принципами работы компонентов. За подробностями о механизмах компонентов обратитесь к разделу "Справочное руководство".
Подключённые транспортные средства являются типичным применением Интернета вещей (IoT). Согласно Гонконгскому институту прикладных научных исследований и технологий, технология подключённых автомобилей относится к системам связи с низкой задержкой между транспортными средствами, пешеходами, дорожной инфраструктурой и облаком. Благодаря обмену информацией в реальном времени внутри таких систем достигается координация между водителями, транспортными средствами и инфраструктурой. Это позволяет своевременно предоставлять пользователям дорог информацию и предупреждения, повышая безопасность и поддерживая системы помощи водителю. Кроме того, технологии подключённых автомобилей поддерживают мониторинг дорожного движения в реальном времени, управление аварийными ситуациями и планирование маршрутов для повышения эффективности транспортного потока. В долгосрочной перспективе они могут поддерживать автономное вождение, помогая выявлять скрытые риски и повышать общую безопасность дорожного движения.
Основные категории связи подключённых транспортных средств приведены в таблице ниже:
| Конечная точка связи | Техническая реализация | Сценарии применения |
|---|---|---|
| Транспортное средство – Транспортное средство (V2V) | Обмен и совместное использование информации между транспортными средствами, включая данные о положении, скорости и другом состоянии | Оценка условий транспортного потока |
| Транспортное средство – Пешеход (V2P) | Пользователи взаимодействуют с транспортными средствами через Wi-Fi, Bluetooth или сотовые сети | Позволяет пользователям контролировать и управлять транспортными средствами с мобильных устройств |
| Транспортное средство – Инфраструктура (V2I) | Обмен информацией между транспортными средствами и дорогами через стационарные дорожные средства связи | Мониторинг состояния дорожного покрытия и определение оптимальных маршрутов движения |
| Транспортное средство – Облако (V2C) | Транспортные средства передают данные в облачные платформы через спутниковые или сотовые сети | Получение команд управления от платформ; обмен данными в реальном времени в облаке |
| Внутренние устройства транспортного средства | Передача данных между внутренними компонентами транспортного средства | Мониторинг и управление внутренними устройствами в реальном времени, обеспечение цифровых систем управления в салоне |
Представьте, что вы разработчик приложений на стороне транспортного средства и отвечаете за управление платформой метрик A вашей компании. Вы хотите спроектировать модель данных для этой платформы в YMatrix. Ваш подход может включать следующие шаги:
| Шаг | Описание |
|---|---|
| 1 | Сбор требований |
| 2 | Проектирование и реализация модели |
| 3 | Тестирование модели |
Характеристики платформы метрик транспортного средства A:
int) метрики: например, уровень заряда батареи, выраженный целыми числами от 0 до 100.float) метрики: например, суммарный пробег.boolean) метрики: например, состояние включения/выключения указателя поворота налево.text) метрики: например, уникальный идентификатор устройства.Шаблоны запросов платформы метрик транспортного средства A:
Примечание!
В данном сценарии термин «устройство» означает отдельные датчики на каждом транспортном средстве. Каждый датчик считается одним «устройством».
Предварительно вычисленные данные с датчиков на транспортном средстве / телеметрия → Облако → YMatrix → Панель мониторинга
Вывод
После тщательного предварительного анализа мы приходим к выводу, что метрики платформы A в основном детерминированы. Однако следует предусмотреть динамический столбец для учёта будущих или изменяющихся метрик. Учитывая большой объём данных и большое количество устройств, рекомендуется использовать структурированную + полуструктурированную широкую таблицу вариативной модели. В качестве основы для создания таблицы используйте движок хранения MARS3, который обеспечивает высокую степень сжатия.
На основе анализа требований предлагается следующая структура таблицы:
Используйте тип данных MXKV для динамических столбцов. Для создания этого типа необходимо сначала установить расширение.
=# CREATE EXTENSION matrixts;
=# CREATE TABLE V2X (
ts timestamp with time zone,
device_id text,
vehicle_type text,
longitude float,
latitude float,
altitude float,
speed float,
left_turn_signal boolean,
right_turn_signal boolean,
emergency_flashers boolean,
power int,
gas int,
windshield_wiper boolean,
mileage float,
signal_strength text,
power_mode text,
control_mode text,
charging_status text,
mxkv mxkv_int4
)
USING MARS3
DISTRIBUTED BY (device_id,vehicle_type)
ORDER BY (device_id,ts,vehicle_type)
PARTITION BY range(ts)
(
START ('2023-01-15') INCLUSIVE
END ('2023-01-30') EXCLUSIVE
EVERY (interval '1 day'),
DEFAULT PARTITION default_p
);
В этом примере:
device_id, vehicle_type.longitude, latitude, altitude, speed, left_turn_signal, right_turn_signal, emergency_flashers, power, gas, windshield_wiper, mileage, signal_strength, power_mode, control_mode, charging_status — всего пятнадцать.mxkv для динамически расширяемых метрик.int, float, text, boolean.(device_id, vehicle_type).(device_id, ts, vehicle_type).ts.2023-01-15 по 2023-01-30.| Шаг | План тестирования | SQL-запрос |
|---|---|---|
| 1 | Просмотр последних 10 записей | SELECT * FROM <表名> ORDER BY ts DESC LIMIT 10 |
| 2 | Запрос общего количества строк | SELECT COUNT(*) FROM <表名> |
| 3 | Получение всех последних метрик для конкретного устройства | SELECT * FROM <表名> WHERE <设备标签列名> = '<设备标签值>' ORDER BY <时间戳列名> DESC LIMIT 1 |
| ... |
Добавьте 100 тестовых строк для структурированных метрик.
=# INSERT INTO V2X (ts, device_id, vehicle_type, longitude, latitude, altitude, speed, left_turn_signal, right_turn_signal, emergency_flashers, power, gas, windshield_wiper, mileage, signal_strength, power_mode, control_mode, charging_status)
SELECT
timestamp '2023-01-15 00:00:00+00' + (random() * (timestamp '2023-01-30 00:00:00+00' - timestamp '2023-01-15 00:00:00+00')) AS ts,
'device_' || (random() * 100 + 1)::int AS device_id,
CASE (random() * 3)::int
WHEN 0 THEN 'car'
WHEN 1 THEN 'truck'
WHEN 2 THEN 'motorcycle'
ELSE 'others'
END AS vehicle_type,
-180 + random() * 360 AS longitude,
-90 + random() * 180 AS latitude,
random() * 500 AS altitude,
random() * 100 AS speed,
random() < 0.5 AS left_turn_signal,
random() < 0.5 AS right_turn_signal,
random() < 0.5 AS emergency_flashers,
random() * 100 AS power,
random() * 100 AS gas,
random() < 0.5 AS windshield_wiper,
random() * 10000 AS mileage,
CASE (random() * 3)::int
WHEN 0 THEN 'low'
WHEN 1 THEN 'medium'
WHEN 2 THEN 'high'
ELSE 'others'
END AS signal_strength,
CASE (random() * 3)::int
WHEN 0 THEN 'normal'
WHEN 1 THEN 'eco'
WHEN 2 THEN 'sport'
ELSE 'others'
END AS power_mode,
CASE (random() * 3)::int
WHEN 0 THEN 'auto'
WHEN 1 THEN 'manual'
ELSE 'others'
END AS control_mode,
CASE (random() * 3)::int
WHEN 0 THEN 'not_charging'
WHEN 1 THEN 'charging'
WHEN 2 THEN 'charged'
ELSE 'others'
END AS charging_status
FROM generate_series(1, 100);
Результаты тестирования:
=# SELECT * FROM V2X ORDER BY ts DESC LIMIT 10;
ts | device_id | vehicle_type | longitude | latitude | altitude | speed | left_turn_signal | right_turn_signal | emergency_flashers | power | gas |
windshield_wiper | mileage | signal_strength | power_mode | control_mode | charging_status | mxkv
-------------------------------+------------+--------------+---------------------+--------------------+--------------------+--------------------+------------------+-------------------+--------------------+-------+-----+-
-----------------+--------------------+-----------------+------------+--------------+-----------------+------
2023-01-29 18:26:28.2555+00 | device_7 | others | 77.7250493925452 | -71.44711665175421 | 470.3520368782552 | 10.08919814806859 | t | f | f | 91 | 60 |
f | 3335.6115546297715 | medium | others | manual | not_charging |
2023-01-29 09:31:03.475343+00 | device_10 | truck | 110.79930700971727 | 80.10310285177269 | 363.9362759505627 | 0.8470622257185312 | t | t | f | 68 | 59 |
f | 8477.632404196207 | high | normal | others | charged |
2023-01-29 08:13:59.117597+00 | device_99 | truck | -109.73747608981242 | -89.35249080260903 | 48.85333218970267 | 37.727205912382544 | t | f | t | 31 | 36 |
t | 7473.970943404033 | high | eco | others | charging |
2023-01-29 05:58:26.571911+00 | device_46 | others | 51.8998425853313 | 88.27679475399947 | 480.07287781433484 | 49.226744573126524 | f | t | f | 42 | 4 |
t | 7143.216304908968 | high | sport | others | not_charging |
2023-01-29 04:15:40.989367+00 | device_40 | motorcycle | -155.34683651071745 | 6.175953177055931 | 181.5449423808442 | 50.05742613215105 | f | f | t | 85 | 87 |
f | 3206.801779860875 | low | normal | others | charging |
2023-01-29 00:00:25.771633+00 | device_100 | truck | 151.84348070359067 | 61.94081118610583 | 79.71495904976855 | 37.50073341871314 | f | f | f | 12 | 63 |
f | 3344.5220642645168 | others | sport | manual | not_charging |
2023-01-28 20:35:29.229556+00 | device_29 | motorcycle | -90.3624239076261 | -9.007833078214986 | 62.318822164742826 | 20.92006269193405 | t | t | t | 27 | 97 |
f | 9388.986611159318 | others | eco | manual | charging |
2023-01-28 13:41:36.964772+00 | device_80 | car | -18.009506474683548 | 64.13247721331942 | 452.8918234900896 | 19.506606969701323 | f | t | t | 43 | 62 |
t | 9398.868263826578 | low | normal | manual | charging |
2023-01-28 11:12:06.491849+00 | device_55 | car | 88.971600816884 | -10.29589404625213 | 372.6116487798965 | 68.00809686681362 | f | f | t | 21 | 76 |
f | 430.6571575941476 | others | others | others | charging |
2023-01-28 09:24:02.536764+00 | device_5 | car | -5.8755335883314785 | 14.557768126530704 | 351.21329889642715 | 9.202603983735003 | t | t | f | 5 | 16 |
t | 1403.2798564383952 | others | sport | others | others |
(10 rows)
=# SELECT COUNT(*) FROM V2X;
count
-------
100
(1 row)
Получите последнюю скорость для устройства 5.
=# SELECT last_not_null(speed,ts) AS last_speed FROM V2X WHERE device_id = 'device_10' LIMIT 1;
last_speed
--------------------------------------------------------
["0.8470622257185312","2023-01-29 09:31:03.475343+00"]
Добавьте новую метрику типа MXKV car_length в динамический столбец mxkv, с типом данных mxkv_int4 и значением 350 (единица измерения: см). Перед вставкой, чтобы оптимизировать сжатие и производительность запросов, используйте UDF mxkv_import_keys() для предварительного определения ключа и объявления набора ключей, которые ожидаются в данных.
=# SELECT mxkv_import_keys('{"car_length": 350}');
mxkv_import_keys
------------------
car_length
(1 row)
Вставьте данные.
=# INSERT INTO V2X(mxkv) values('{"car_length":350}');
INSERT 0 1
Выполните запрос на вставленную пару ключ-значение.
=# SELECT mxkv->'car_length' as car_length FROM V2X;
Примечание!
Более подробную информацию об использовании MXKV см. в разделе Расширенные типы данных.
Примечание!
Здесь приведены только базовые примеры тестирования. За дополнительными сценариями тестирования обращайтесь к разделу Начало работы в графическом интерфейсе. В рабочих средах разрабатывайте тестовые запросы в соответствии с фактическими требованиями к запросам.