데이터베이스에 다양한 필드 수를 사용하여 측정값을 저장하는 가장 효율적인 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1629458

  •  06-07-2019
  •  | 
  •  

문제

우리는 강이나 수로를 통해 흐르는 물의 속도를 측정하는 환경 센서로부터 측정값을 수집하는 데이터 수집 시스템을 보유하고 있습니다.각 측정은 고정된 수의 값을 생성합니다(예:날짜, 시간, 온도, 압력 등) 및 속도 값 목록.
원래 센서는 세 가지 속도 값을 제공했기 때문에 FireBird 데이터베이스에 있는 단일 테이블의 자체 열에 각 값을 저장했습니다.나중에 최대 9개의 속도 값을 출력할 수 있는 센서가 도입되었으므로 간단히 6개의 열을 추가했습니다.대부분의 센서가 9개 미만의 값을 사용하더라도 대부분의 열에 0만 포함되어 있으면 문제가 되지 않을 것이라고 생각했습니다.
그러나 이제 나는 1에서 256까지의 값을 출력할 수 있는 새로운 세대에 직면하고 있으며 특히 대부분의 측정값에는 여전히 3에서 9까지의 값만 포함되므로 247개의 열을 추가하는 것은 그리 효율적이지 않을 것이라고 가정합니다.
측정값은 10분마다 수집되고 데이터베이스에는 30~50개 센서에 대한 모든 데이터가 포함되어 있으므로 몇 년이 지나면 총 데이터 양이 상당히 커집니다. 그러나 임의의 기간에 대한 개요/그래프를 생성할 수 있어야 합니다.

그렇다면 변수 값 목록을 저장하는 가장 효율적인 방법은 무엇일까요?
각 레코드에는 고유 ID가 있으므로 모든 속도 값을 별도의 테이블에 저장할 수 있다고 가정합니다. 각 값에는 레코드 ID 태그가 지정됩니다.나는 이것이 그다지 효율적이지 않을 것이고 시간이 지나면 매우 느려질 것이라는 느낌을 받았습니다.

도움이 되었습니까?

해결책

효율적인 인덱스를 사용하면 데이터베이스에서 테이블의 많은 양의 데이터를 처리할 수 있습니다.따라서 다음 테이블 구조를 사용할 수 있습니다.

create table measurements (
     id,
     seq integer, -- between 1 and 256
     ts timestamp, -- Timestamp of the measurement
     value decimal(...)
)

다음에 대한 색인 생성 id, id, seq 그리고 ts.그러면 데이터를 효율적으로 검색할 수 있습니다.데이터베이스를 신뢰할 수 없다면 수백만 개의 행을 삽입하고 몇 가지 선택을 실행하여 얼마나 잘 작동하는지 확인하십시오.

비교하려고:여기에 1억 1,200만 개의 행이 있는 Oracle 데이터베이스가 있고 120ms(0.12초) 이내에 타임스탬프 또는 ID로 레코드를 선택할 수 있습니다.

다른 팁

텍스트 필드에 직렬화 된 데이터를 저장할 수 있습니다 (예 : json-encoding).

[<velocity-value-1>, <velocity-value-2>, ...]

그런 다음 코드에서 쿼리 후 값을 조정하십시오.

저장된 값이 아닌 다른 필드로 쿼리를 필터링하는 경우에도 잘 작동합니다. 값으로 필터를 사용하는 경우 WHERE 조항은 악몽이 될 것입니다.

두 번째 테이블과 함께 갈 것입니다.

table measurements (Id, DateTime, Temperature, Pressure)
table velocity (Id, MeasurementId, Sequence, Value)

Velocity.MeasurementId 참조 Measurements.Id.
Velocity.Sequence 해당 측정의 속도 값의 색인 (1-256)입니다.

이러한 테이블을 가능한 한 실제와 가까운 데이터로 채우고 SQL 문을 테스트하여 최상의 인덱스를 찾으십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top