Пример моделирования данных в сценарии Интернета транспортных средств

Этот документ является третьей главой серии «Моделирование временных данных». Компания YMatrix считает, что проектирование моделей данных напрямую влияет на ценность потребления и использования данных. Поэтому помимо технического введения мы посвящаем всю главу тому, чтобы дать вам четкое понимание концепции, применения и развития модели временных данных.

  • Первая статья — «Что такое модель временных данных?» — с помощью ответов на несколько глубоких вопросов поможет вам окончательно разобраться в самой концепции модели временных данных.
  • Вторая статья — «Идеи моделирования временных последовательностей» — попытается предоставить справочные материалы по подходам к проектированию от YMatrix с теоретической точки зрения.
  • Третья и четвертая статьи — примеры моделирования данных в сценариях Интернета транспортных средств (то есть данный документ) и умного дома. На основе «идей моделирования временных последовательностей» они демонстрируют лучшие практики моделирования различных временных сценариев в YMatrix.

Примечание!
Данный материал приведён исключительно в качестве справочного примера. Перед началом проектирования рекомендуется внимательно ознакомиться с разделом Архитектура YMatrix, а также с принципами работы компонентов. Подробнее о принципах работы компонентов см. в главе «Справочное руководство».

1 Что такое Интернет транспортных средств?

Интернет транспортных средств — один из типичных сценариев применения Интернета вещей (IoT). Согласно Гонконгскому институту прикладных наук и технологий Китая, Интернет транспортных средств представляет собой систему низколатентной связи между транспортными средствами, между транспортными средствами и пешеходами, между транспортными средствами и дорожной инфраструктурой, а также между транспортными средствами и облаком. Благодаря передаче информации в реальном времени в системе Интернета транспортных средств люди, транспортные средства и дорожная инфраструктура могут координировать и взаимодействовать друг с другом, а состояние дороги оперативно сообщается и предупреждается для пользователей дорог, тем самым повышая безопасность дорожного движения и поддержку водителя. В то же время технологии Интернета транспортных средств могут применяться для мониторинга дорожного движения в реальном времени, управления авариями и планирования маршрутов движения, что способствует повышению эффективности транспортных потоков. В долгосрочной перспективе Интернет транспортных средств может взаимодействовать с развитием технологий автономного вождения, помогая автономному вождению выявлять скрытые риски и повышать безопасность дорожного движения.

Основные категории Интернета транспортных средств следующие:

Тип терминала связи Техническая реализация Сценарии применения
Транспортные средства и транспортные средства Обмен информацией и совместное использование данных между транспортными средствами, включая данные о состоянии транспортного средства: местоположение, скорость движения и т.д. Оценка дорожной обстановки
Транспортные средства и пешеходы Пользователи могут обмениваться информацией с транспортным средством с помощью беспроводных технологий связи, таких как Wi-Fi, Bluetooth и сотовая связь Позволяет пользователям контролировать и управлять транспортным средством через соответствующие мобильные устройства
Транспортное средство и дорожная инфраструктура Использование стационарных наземных коммуникационных устройств для обеспечения обмена информацией между транспортным средством и дорожной инфраструктурой Мониторинг дорожной обстановки и направление транспортных средств по оптимальному маршруту
Транспортное средство и облако Транспортные средства осуществляют передачу данных с платформами сервисов Интернета транспортных средств с помощью беспроводных технологий, таких как спутниковая или сотовая связь Транспортные средства принимают управляющие команды от платформы; оперативный обмен данными транспортных средств в облаке
Между оборудованием внутри транспортного средства Передача данных между устройствами внутри транспортного средства Оперативный контроль состояния оборудования и управление работой для создания цифровой системы управления в салоне

2 Лучшие практики моделирования в сценарии Интернета транспортных средств

Можно представить, что вы являетесь разработчиком приложений для транспортных средств и отвечаете за управление и поддержку платформы показателей транспортных средств A в вашей компании. Теперь вы хотите выполнить моделирование и проектирование бизнес-логики этой платформы в YMatrix. Возможные шаги следующие:

Номер Шаг
1 Исследование требований
2 Проектирование и реализация модели
3 Тестирование модели

2.1 Исследование требований

  • Характеристики данных платформы показателей транспортных средств A:

    • Объём данных огромен: уровень PB.
    • Большое количество устройств: одновременно могут собирать и передавать данные тысячи устройств.
    • Показатели бортового оборудования: относительно фиксированные, но требуется возможность динамического расширения показателей.
    • Типы значений показателей:
      1. Целочисленные показатели: целые числа от 0 до 100 представляют уровень заряда от 0 до 100% и т.д.
      2. Показатели типа float: общий пробег транспортного средства и т.д.
      3. Показатели типа boolean: состояние переключателя левого указателя поворота и т.д.
      4. Текстовые показатели: уникальный идентификатор устройства и т.д.
  • Особенности запросов платформы показателей транспортных средств A:

    • Преобладают точечные и детальные запросы по устройствам.

Примечание!
В данном сценарии семантика «устройства» относится к различным датчикам на каждом транспортном средстве, каждый датчик называется «устройством».

  • Полный поток данных:

Предварительно рассчитанные данные с датчиков / данные трассировки -> Облако -> YMatrix -> Страница мониторинга

Вывод
После тщательного и всестороннего предварительного исследования мы пришли к выводу, что в YMatrix показатели платформы A являются высокоструктурированными, однако всё же требуется наличие динамического столбца для гибкого добавления новых или изменяющихся показателей. Учитывая большой объём данных и большое количество устройств, рекомендуется использовать вариант широкой таблицы структурированных + полуструктурированных данных, выбрав в качестве базовой таблицы механизм хранения MARS2, обладающий хорошими характеристиками сжатия.

2.2 Проектирование и реализация модели

2.2.1 Структура таблицы

На основании результатов анализа требований пример проектирования структуры таблицы следующий:

Для динамических столбцов можно выбрать тип данных 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);

В этом примере:

  • Столбцы tags — 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 образует отдельную партицию.

2.2.2 Тестирование модели

Номер План тестирования 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);

Результаты тестирования:

  1. Просмотр последних 10 записей
    =# 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)
  2. Запрос общего количества строк
    =# SELECT COUNT(*) FROM V2X;
    count
    -------
    100
    (1 row)
  3. Запрос последнего непустого значения определённого показателя устройства

Проверка последней скорости устройства 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 см. в разделе Расширенный тип данных.

Примечание!
Здесь приведены только простые примеры тестирования. Дополнительные примеры тестирования сценариев см. в графическом интерфейсе, раздел Легкое начало работы. В реальной среде разрабатывайте конкретные тестовые запросы в соответствии с конкретными требованиями к запросам.