Этот документ является третьей главой серии «Моделирование временных данных». Компания YMatrix считает, что проектирование моделей данных напрямую влияет на ценность потребления и использования данных. Поэтому помимо технического введения мы посвящаем всю главу тому, чтобы дать вам четкое понимание концепции, применения и развития модели временных данных.
Примечание!
Данный материал приведён исключительно в качестве справочного примера. Перед началом проектирования рекомендуется внимательно ознакомиться с разделом Архитектура YMatrix, а также с принципами работы компонентов. Подробнее о принципах работы компонентов см. в главе «Справочное руководство».
Интернет транспортных средств — один из типичных сценариев применения Интернета вещей (IoT). Согласно Гонконгскому институту прикладных наук и технологий Китая, Интернет транспортных средств представляет собой систему низколатентной связи между транспортными средствами, между транспортными средствами и пешеходами, между транспортными средствами и дорожной инфраструктурой, а также между транспортными средствами и облаком. Благодаря передаче информации в реальном времени в системе Интернета транспортных средств люди, транспортные средства и дорожная инфраструктура могут координировать и взаимодействовать друг с другом, а состояние дороги оперативно сообщается и предупреждается для пользователей дорог, тем самым повышая безопасность дорожного движения и поддержку водителя. В то же время технологии Интернета транспортных средств могут применяться для мониторинга дорожного движения в реальном времени, управления авариями и планирования маршрутов движения, что способствует повышению эффективности транспортных потоков. В долгосрочной перспективе Интернет транспортных средств может взаимодействовать с развитием технологий автономного вождения, помогая автономному вождению выявлять скрытые риски и повышать безопасность дорожного движения.
Основные категории Интернета транспортных средств следующие:
| Тип терминала связи | Техническая реализация | Сценарии применения |
|---|---|---|
| Транспортные средства и транспортные средства | Обмен информацией и совместное использование данных между транспортными средствами, включая данные о состоянии транспортного средства: местоположение, скорость движения и т.д. | Оценка дорожной обстановки |
| Транспортные средства и пешеходы | Пользователи могут обмениваться информацией с транспортным средством с помощью беспроводных технологий связи, таких как Wi-Fi, Bluetooth и сотовая связь | Позволяет пользователям контролировать и управлять транспортным средством через соответствующие мобильные устройства |
| Транспортное средство и дорожная инфраструктура | Использование стационарных наземных коммуникационных устройств для обеспечения обмена информацией между транспортным средством и дорожной инфраструктурой | Мониторинг дорожной обстановки и направление транспортных средств по оптимальному маршруту |
| Транспортное средство и облако | Транспортные средства осуществляют передачу данных с платформами сервисов Интернета транспортных средств с помощью беспроводных технологий, таких как спутниковая или сотовая связь | Транспортные средства принимают управляющие команды от платформы; оперативный обмен данными транспортных средств в облаке |
| Между оборудованием внутри транспортного средства | Передача данных между устройствами внутри транспортного средства | Оперативный контроль состояния оборудования и управление работой для создания цифровой системы управления в салоне |
Можно представить, что вы являетесь разработчиком приложений для транспортных средств и отвечаете за управление и поддержку платформы показателей транспортных средств A в вашей компании. Теперь вы хотите выполнить моделирование и проектирование бизнес-логики этой платформы в YMatrix. Возможные шаги следующие:
| Номер | Шаг |
|---|---|
| 1 | Исследование требований |
| 2 | Проектирование и реализация модели |
| 3 | Тестирование модели |
Характеристики данных платформы показателей транспортных средств A:
Особенности запросов платформы показателей транспортных средств A:
Примечание!
В данном сценарии семантика «устройства» относится к различным датчикам на каждом транспортном средстве, каждый датчик называется «устройством».
Предварительно рассчитанные данные с датчиков / данные трассировки -> Облако -> YMatrix -> Страница мониторинга
Вывод
После тщательного и всестороннего предварительного исследования мы пришли к выводу, что в YMatrix показатели платформы A являются высокоструктурированными, однако всё же требуется наличие динамического столбца для гибкого добавления новых или изменяющихся показателей. Учитывая большой объём данных и большое количество устройств, рекомендуется использовать вариант широкой таблицы структурированных + полуструктурированных данных, выбрав в качестве базовой таблицы механизм хранения MARS2, обладающий хорошими характеристиками сжатия.
На основании результатов анализа требований пример проектирования структуры таблицы следующий:
Для динамических столбцов можно выбрать тип данных 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 MARS2
DISTRIBUTED BY (device_id,vehicle_type)
PARTITION BY range(ts)
(
START ('2023-01-15') INCLUSIVE
END ('2023-01-30') EXCLUSIVE
EVERY (interval '1 day'),
DEFAULT PARTITION default_p
);
=# CREATE INDEX ON V2X USING mars2_btree (device_id,ts,vehicle_type);
В этом примере:
2023-01-15 по 2023-01-30 образует отдельную партицию.| Номер | План тестирования | SQL-запрос |
|---|---|---|
| 1 | Просмотр последних 10 записей | SELECT * FROM <Table Name> ORDER BY ts DESC LIMIT 10 |
| 2 | Запрос общего количества строк | SELECT COUNT(*) FROM <table name> |
| 3 | Запрос всех последних показателей, отправленных определённым устройством | SELECT * FROM <Table name> WHERE <Device tag column name> = '<Device tag value>' ORDER BY <Timestamp column name> 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 | w
indshield_wiper | mileage | signal_strength | power_mode | control_mode | charging_status | mxkv
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2023-01-29 21:53:27.754744+00 | device_58 | motorcycle | -140.79258522765215 | 89.35868408629588 | 209.74325842947826 | 7.559001139516397 | t | t | t | 93 | 65 | f
| 5882.489034161899 | others | sport | others | charging |
2023-01-29 16:50:34.199873+00 | device_81 | car | 81.53072026224788 | 68.19305944227892 | 148.1462308308661 | 13.198297428062489 | t | f | t | 46 | 61 | t
| 4511.35947286371 | medium | sport | others | charging |
2023-01-29 12:55:46.399362+00 | device_64 | truck | -44.714334671379135 | -25.70332357303201 | 467.8799151243442 | 10.891007142353715 | f | t | f | 84 | 35 | t
| 2560.9704263982635 | high | sport | others | charged |
2023-01-28 20:57:47.338926+00 | device_76 | motorcycle | 154.27746736812526 | 62.690265649507495 | 259.82523744619533 | 83.50521685533465 | f | f | t | 89 | 8 | f
| 1532.3430683284655 | high | normal | auto | charged |
2023-01-28 18:05:20.571742+00 | device_92 | car | 83.76965429529218 | 8.049747667089093 | 143.73997285467334 | 12.555222600038718 | t | f | f | 14 | 45 | f
| 9997.57813287939 | medium | eco | others | others |
2023-01-28 08:45:11.965559+00 | device_31 | others | 99.77044288198567 | 12.903015903288804 | 363.75041248912333 | 36.47226613770371 | f | f | t | 69 | 3 | f
| 3691.816009071509 | high | others | manual | not_charging |
2023-01-28 06:18:43.954116+00 | device_46 | motorcycle | -47.38049551213621 | -79.18208378659074 | 175.75280982307186 | 66.30605691081897 | t | f | f | 45 | 54 | t
| 9393.80450096177 | high | others | others | others |
2023-01-28 02:37:52.616967+00 | device_93 | truck | 85.90194913335677 | 40.30649225935946 | 391.81388120428375 | 82.57330803350484 | f | f | f | 26 | 75 | f
| 3785.2133153634427 | medium | eco | others | not_charging |
2023-01-27 22:45:29.482177+00 | device_97 | truck | -84.89970873408637 | 44.363184540463294 | 194.22710732897565 | 75.3934265851349 | t | f | f | 66 | 20 | t
| 778.0037705985521 | medium | eco | manual | charged |
2023-01-27 21:58:16.378729+00 | device_86 | truck | -160.41993080977775 | 29.832974328175652 | 481.3241481940853 | 29.14603485833851 | t | t | f | 27 | 15 | t
| 975.3916463929002 | high | eco | others | charged |
(10 rows)
=# SELECT COUNT(*) FROM V2X;
count
-------
100
(1 row)
Проверка последней скорости устройства 10.
=# SELECT last_not_null(speed,ts) AS last_speed FROM V2X WHERE device_id = 'device_86' LIMIT 1;
last_speed
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
["29.14603485833851","2023-01-27 21:58:16.378729+00"]
(1 row)
Добавлен новый показатель типа 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 см. в разделе Расширенный тип данных.
Примечание!
Здесь приведены только простые примеры тестирования. Дополнительные примеры тестирования сценариев см. в графическом интерфейсе, раздел Легкое начало работы. В реальной среде разрабатывайте конкретные тестовые запросы в соответствии с конкретными требованиями к запросам.