[SQL] 센서 / 읽기 / 경고 데이터베이스 설계에 대한 의견
SQL센서 / 읽기 / 경고 데이터베이스 설계에 대한 의견
난 내가 천천히 내 디자인 문제의 핵심을 얻고있다 믿습니다 그러나 ;-) 아마 너무 많은 요즘, 데이터베이스 설계에 관한 몇 가지 질문을 요청했습니다 천천히 아래로 비등하고있다. 나는 아직도 "경고"가 데이터베이스에 저장하는 방법에 관한 결정의 부부와 씨름하고있다.
이 시스템에서 경고가 작용, 인정해야하는 기업 등이다
처음에 나는 (매우 삭감)이 같은 경고에 독서 관련 : -
[Location]
LocationId
[Sensor]
SensorId
LocationId
UpperLimitValue
LowerLimitValue
[SensorReading]
SensorReadingId
Value
Status
Timestamp
[SensorAlert]
SensorAlertId
[SensorAlertReading]
SensorAlertId
SensorReadingId
이 센서가 경고 또는 아니라는 것을 지시 읽기 때문에 마지막 표는 경고와 함께 독서를 연결합니다.
각 경고는 단 하나의 센서입니다 만 (과 관련이 센서 판독 내가 DB가 허용 귀찮게해야해야한다 반면에 -이 디자인의 문제는 여러 센서로부터 측정 값은 하나의 경고와 연관 될 수 있다는 것입니다 이 생각?).
나는 일을 단순화하는 이유도 SensorAlertReading 테이블과 귀찮게 생각? 대신에 나는이 작업을 수행 할 수 있습니다 :
[Location]
LocationId
[Sensor]
SensorId
LocationId
[SensorReading]
SensorReadingId
SensorId
Value
Status
Timestamp
[SensorAlert]
SensorAlertId
SensorId
Timestamp
[SensorAlertEnd]
SensorAlertId
Timestamp
기본적으로 지금 경고와 함께 독서를 연결 아니에요 - 대신 그냥 경고가 특정 센서 시작 및 종료 시간 사이 활성화 된 것을 알고, 나는 내가 할 수있는 경고의 측정 값을보고합니다.
분명히 단점은 내가 더 이상 나에게 경고하는 동안 발생 판독을 삭제 중지 어떤 제약이 없다,하지만 난 확실히 제약이 켜지지입니다 아니에요.
이제 개발자 / DBA로 외부에서 당신이 아프게되고 싶어하거나 합리적인 것처럼 보인다 만들어 그 것이다 찾고?
아마도 내가 누락 될 수 있음을이 일을 다른 방법이 있나요?
감사.
편집하다: 여기에 또 다른 생각 - 그것은 다른 방식으로 작동합니다. 이 표에 경고 보통에서가는 각 센서의 상태 변화를 저장하고 판독은 단순히 특정 상태와 연관된다. 나중에 생각 디부 -이 모든 문제를 해결하는 것? (나는 확실히에 대한 아니에요 유일한 것은 내가 도움이되지 수있는 더 나은 이름 (어쩌면 SensorReadingGroup이 있다고 생각 테이블 "SensorState"를 호출입니다) : -
[Location]
LocationId
[Sensor]
SensorId
LocationId
[SensorState]
SensorStateId
SensorId
Timestamp
Status
IsInAlert
[SensorReading]
SensorReadingId
SensorStateId
Value
Timestamp
이에 대한 우아한 해결책이 있어야합니다!
해결법
-
==============================
1.데이터 모델
데이터 모델
나는 당신의 데이터 모델은 다음과 같이해야한다고 생각 : ▶ 센서 데이터 모델 ◀. (2 페이지 역사를 다시 다른 질문 관련).
관계형 모델링 표준에 익숙하지 않은 독자는 ▶ IDEF1X 표기법을 찾을 수 있습니다 ◀ 유용합니다.
비즈니스 (해설에서 개발 된 규칙)
내가 그들을 삭제 한 그래서, 지금은 사용되지 않는 일부 초기 비즈니스 규칙을 식별했다
이러한 수의 관계 (데이터 모델에 인접한 읽기)의 "읽기"수 있습니다. 비즈니스 규칙 및 모든 묵시적 참고 및 데이터 무결성의 구현, 따라서 어떤 ISO SQL 데이터베이스에, 규칙, CHECK 제약 조건에 의해 보장 될 수있다. 이것은 관계형 키와 엔티티와 관계 모두의 발전에 IDEF1X의 데모입니다. 동사 문구가 더 단순한 번창보다 있습니다.
외에도 세 개의 참조 테이블의 정적에서 확인 기관은 위치, NetworkSlave 및 사용자입니다. 나는 그것을 자신의 제목을 부여 ahve 있도록 센서, 시스템의 핵심입니다.
위치
NetworkSlave
사용자
감지기
댓글에 대한 응답
-
==============================
2.여기에 문제에 내 두 센트입니다.
여기에 문제에 내 두 센트입니다.
을 alertType 표는 경고의 가능한 모든 종류를 보유하고 있습니다. AlertName 높은 온대, 낮은 압력, 낮은 수위 등과 같이 할 수있다
AlertSetup 표는 특정 경보 유형 센서로부터 경보 임계 값의 설정을 허용한다. 예를 들어, 100 TresholdLevel 판독 값 = 100 TresholdType = "HI"트리거 경고한다.
그들이 서버 (어플리케이션)에 스트리밍 된 바와 읽기 표는 센서 판독 값을 보유하고있다.
경고 표는 모든 경고를 보유하고 있습니다. 이 경고하고 완료 마지막 (FirstReadingId, LastReadingId)을 트리거 첫 번째 독서에 대한 링크를 유지합니다. 제 (SensorId, AlertTypeId) 조합에 대한 활성 경고가있는 경우이 isActive는 사실이다. 이 isActive은 경고 임계 값 아래로가는 읽어 false로 설정할 수 있습니다. 운영자가 경고를 인정했다 수단을 IsAcknowledged.
-
==============================
3.여기에 처리해야 주요 "삼각형"센서, [센서] 읽기 및 경고입니다. 가정하면 (설계 "한 번에 모두로드"반대)이 발생하는 그대로 당신은 활동을 추적 할 필요가, 세 번째 솔루션은 우리가 최근에했던 뭔가 비슷합니다. 몇 개조하면 되겠과는 같을 것이다 :
여기에 처리해야 주요 "삼각형"센서, [센서] 읽기 및 경고입니다. 가정하면 (설계 "한 번에 모두로드"반대)이 발생하는 그대로 당신은 활동을 추적 할 필요가, 세 번째 솔루션은 우리가 최근에했던 뭔가 비슷합니다. 몇 개조하면 되겠과는 같을 것이다 :
[Location] LocationId [Sensor] SensorId LocationId CurrentSensorState -- Denormalized data! [SensorReading] SensorReadingId SensorState Value Timestamp [SensorStateLog] SensorId Timestamp SensorState Status -- Does what? IsInAlert (Primary key is {SensorId, Timestamp})
"SensorState"는 관련 조회 테이블 목록 (그리고 제약) 모든 가능한 상태로, SensorStateId 수 있습니다.
아이디어는 센서는 센서와 쇼 그것의 현재 상태 당 하나 개의 행을 포함합니다. SensorReading는 센서 판독에 연속적으로 갱신된다. 만약 주어진 센서의 현재 상태 변경 (센서의 현재 상태에서 즉, 새로운 읽기의 상태가 달라), 현재 상태를 변경하고 상태의 변화를 보여주는 SensorStateLog에 행을 추가 할 때. (선택적으로, "종료 상태"타임 스탬프하지만 쓰기에의 까다로운 코드 있다는하여 해당 센서의 "이전"항목을 업데이트 할 수 있습니다.)
센서 테이블에 CurrentSensorState 데이터를 비정규하지만, 경우 제대로 유지 (당신은 수백만 개의 행이있는 경우) 그것은 가치가 노력 할 수 있도록 쿼리 현재 상태가 훨씬 더 효율적으로 만들 것이다.
모든이의 명백한 단점은 경고가 더 이상 기업이며, 그들은 그 훨씬 더 열심히 추적하고 식별 될 수 없다는 것이다. 이 쉽게 즉시 식별하고 사용할 수 있어야하는 경우, 세 번째 방식은 당신이해야 할 일을하지 않습니다.
from https://stackoverflow.com/questions/4335189/opinions-on-sensor-reading-alert-database-design by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버 WHILE 루프 2008 삽입 (0) | 2020.07.06 |
---|---|
[SQL] 오라클 리드 및 래그 함수 테라 당량 (0) | 2020.07.06 |
[SQL] 열과 행을 변환하는 방법 (0) | 2020.07.06 |
[SQL] 다른 테이블을 기반으로 업데이트 테이블 (0) | 2020.07.06 |
[SQL] SQL 테이블에 Active Directory 데이터 (0) | 2020.07.06 |