Дизайн базы данных для частичного изменения точек данных с историей и функциональностью снимков? - PullRequest
0 голосов
/ 26 ноября 2018

Я ищу лучшую практику или решение на концептуальном уровне проблемы, над которой я работаю.

У меня есть набор точек данных (около 500), которые частично изменены,пользователем, со временем.Важно уметь определить, какие значения были изменены в какой момент времени.Данные могут выглядеть следующим образом:

Данные меняются со временем:

+--------------------------------------------------------------------------------------+
|   Date     |  Value no. 1  |  Value no. 2  |  Value no. 3  |  ...  |  Value no. 500  | 
|------------+---------------+---------------+---------------+-------+-----------------|
|  1/1/2018  |               |               |       2       |       |        1        |
|  1/3/2018  |       2       |       1       |               |       |                 |
|  1/7/2018  |               |               |       4       |       |        8        |
| 1/12/2018  |       5       |       3       |               |       |                 |
....

Должна быть возможность сделать снимок в определенный момент времени, чтобы получить полный набор точек данных, которые были действительны для данного конкретного момента времени, например:

Снимок, сделанный 1/3/2018, даст:

+---------------------------------------------------------+
|  Value 1  |  Value 2  |  Value 3  |  ...  |  Value 500  | 
|-----------+-----------+-----------+-------+-------------|
|     2     |     1     |     2     |   0   |      1      |

Снимок, сделанный 1/9/2018, даст:

+---------------------------------------------------------+
|  Value 1  |  Value 2  |  Value 3  |  ...  |  Value 500  | 
|-----------+-----------+-----------+-------+-------------|
|     2     |     1     |     4     |   0   |      8      |

Снимок, сделанный 13.01.2008, даст:

+---------------------------------------------------------+
|  Value 1  |  Value 2  |  Value 3  |  ...  |  Value 500  | 
|-----------+-----------+-----------+-------+-------------|
|     5     |     3     |     4     |   0   |      8      |

и так далее ...

Я не связан какой-то конкретной технологией баз данных,так что подойдет либо SQL, либо NoSQL.Вероятно, невозможно выполнить все требования в домене DB - некоторые из них, вероятно, должны быть рассмотрены в коде.Но мой главный вопрос в том, какая технология базы данных лучше всего подходит для этой задачи?

Я не совсем уверен, что она подходит для базы данных временных рядов (TSDB), поскольку в данной задаче изменяется только часть значений.время, и важно знать, какие значения изменились.Может я не прав?

/ Крис

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Я бы посоветовал смоделировать это в разреженном формате, что-то вроде:

CREATE TABLE DataPoint (
    DataID int,               /* 1 to 500 in your example, or whatever you need to identify it*/
    ValidFrom timestamp,  /*default value 01/01/1970-00:00:00 or a suitable "Epoch" */
    ValidUntil timestamp, /*default value 31/12/3999-00:00:00 or again something that is in the far future for your case */
    value Number (7,5)  /* again, this may be any data type, or even more than one field if needed, like Price & Currency
);

Мы только что определили набор данных и «интервал», в котором каждый из данных имеет определенное значение.поэтому, если вы вчера измерили DataPoint 1 и получили значение 89,768, вы вставите:

DataId = 1 ValidFrom = 26/11 / 2018-14: 52: 41 ValidUntil = 31/12 / 3999-00:00:00 Значение = 89,768

Затем вы измеряете его снова завтра и получите:

DataId = 1 ValidFrom = 28/11/2018-14: 51: 23 ValidUntil = 31/12/ 3999-00: 00: 00 Значение = 89,443

(Предположим, что у вас также есть логика, чтобы при записи нового значения обновлять запись текущего значения и назначать ValidUntil = 28/11/112018-14: 51: 23 это на самом деле не нужно, но упростит пример запроса).

Через месяц вы накопили больше измерений для данных № 1 и то же самое в разные моменты для данных № 2–500.Теперь вы хотите узнать, какие значения были в полдень сегодня (то есть один месяц назад), то есть 27/11/2018: 12: 00: 00: 00

Select DataID, Value from DataPoint where ValidFrom <= 27/11/2018:12:00:00 and ValidUntil > 27/11/2018:12:00:00

Это вернет:

  001,89.768
  002,45.678
  ...,...
  500,112.809

Относительно регистрации, кто это сделал или по какой причине, вы можете войти в систему отдельно (сохранить, например, DataPoint Id, Timestamp, UserId ...) или сделать его частью исходной таблицы, чтобы при регистрации новой точки данных вы также регистрировали, кто ее измерял.

0 голосов
/ 26 ноября 2018

Взгляните на механизм временных таблиц SQL Server , который может быть решением в вашем случае.Этот подход позволяет выполнять запросы, упомянутые в вопросе, например

SELECT * 
FROM my_data   
FOR SYSTEM_TIME AS OF '2018-01-01'

. Однако таблица в примере выглядит очень большой (возможно, денормализованной).Я бы предложил сгруппировать столбцы по некоторым техническим или функциональным характеристикам (вертикальное разбиение), чтобы избежать дальнейших недостатков в обслуживании.

...