[SQL] 서브 타입의 참조 무결성을 구현하는 방법
SQL서브 타입의 참조 무결성을 구현하는 방법
나는 관계형 데이터베이스에서 다음과 같은 테이블이 :
[Sensor]
LocationId [PK / FK -> Location]
SensorNo [PK]
[AnalogSensor]
LocationId [PK/FK -> Sensor]
SensorNo [PK/FK -> Sensor]
UpperLimit
LowerLimit
[SwitchSensor]
LocationId [PK/FK -> Sensor]
SensorNo [PK/FK -> Sensor]
OnTimeLimit
[Reading]
LocationId [PK/FK -> Sensor]
SensorNo [PK/FK -> Sensor]
ReadingDtm [PK]
[ReadingSwitch]
LocationId [PK/FK -> Reading]
SensorNo [PK/FK -> Reading]
ReadingDtm [PK/FK -> Reading]
Switch
[ReadingValue]
LocationId [PK/FK -> Reading]
SensorNo [PK/FK -> Reading]
ReadingDtm [PK/FK -> Reading]
Value
[Alert]
LocationId [PK/FK -> Reading]
SensorNo [PK/FK -> Reading]
ReadingDtm [PK/FK -> Reading]
기본적으로, ReadingSwitch 및 ReadingValue는 읽기와 SwitchSensor 및 AnalogSensor의 하위 유형 센서의 아형이있다 있습니다. 이 모두를 할 수 없으며, 센서는 어느 쪽 AnalogSensor 또는 SwitchSensor 할 수있다 - 독서는 중 하나 SwitchReading 또는 ValueReading 값이 될 수 있습니다.
지금까지이 일을 건너 한 유일한 방법은 여기에있다.
확실히 이런 종류의 물건을 할 수있는 더 좋은 방법이 있어야합니다.
내가 생각할 수있는 유일한 방법은 서브 타입을 가지고 있지만 완전히 모든 것을 확장하지 않는 것입니다 :
[SwitchSensor]
LocationId [PK/FK -> Location]
SensorNo [PK]
[AnalogSensor]
LocationId [PK/FK -> Location]
SensorNo [PK]
[SwitchReading]
LocationId [PK/FK -> SwitchSensor]
SensorNo [PK/FK -> SwitchSensor]
ReadingDtm
Switch
[AnalogReading]
LocationId [PK/FK -> AnalogSensor]
SensorNo [PK/FK -> AnalogSensor]
ReadingDtm
Value
[AnalogReadingAlert]
LocationId [PK/FK -> AnalogReading]
SensorNo [PK/FK -> AnalogReading]
ReadingDtm [PK/FK -> AnalogReading]
[SwitchReadingAlert]
LocationId [PK/FK -> SwitchReading]
SensorNo [PK/FK -> SwitchReading]
ReadingDtm [PK/FK -> SwitchReading]
그렇게 나쁜하지만 너무 중복되어야 할 것이다 그래서 나는 또한, 경고 테이블을 참조하는 테이블이 없을 수도 있습니다 어느 :
[AnalogReadingAlertAcknowledgement]
...
[AnalogReadingAlertAction]
...
[SwitchReadingAlartAcknowledgement]
...
[SwitchReadingAlartAction]
기타
이 문제는 사람에게 어떤 의미가 있습니까?
해결법
-
==============================
1.그 중에 특히 테이블을 두 배로하지, 필요하지 않습니다. 즉 순수한 정신입니다.
그 중에 특히 테이블을 두 배로하지, 필요하지 않습니다. 즉 순수한 정신입니다.
모델링 관계형 데이터베이스에 대한 표준 (IDEF1X가) (높은 품질, 시장의 고성능 결국 적어도)를 통해 25 년 동안 일반적으로 사용 되었기 때문에, 그 용어를 사용합니다. 날짜 및 다웬, 나는 2009 년에 자신의 관심을 가져왔다 때까지, 그들은 IDEF1X 모르고 있었다 그들이 관계 모델을 progresssuppress하기 위해 수행 한 훌륭한 작품과 일치 despite1, 따라서 우리가 사용하고있는 표준 용어에 대한 새로운 terminology2있다 수십 년. 또한, 새로운 용어 IDEF1X이처럼, 모든 경우를 처리하지 않습니다. 그러므로 나는 기존의 표준 용어를 사용하고, 새로운 용어를 피하십시오.
IEC / ISO / ANSI SQL 거의 적절 커드의 3NF (날짜 및 다웬의 "5NF")을 처리하고는 전혀 baseType 여기서-하위 유형 구조를 지원하지 않습니다; 더 선언적 제약이 거기 없다 (그리고이 있어야한다).
그러나, 나는 계정으로 모든 것을 가지고. 나를 효과적으로 전체 담론과 함께, 내가 의도적으로 그들이 필요로 어떤 정도에 SQL을 기존의 기존의 제약 조건을 사용하여 할 수있는 사람들에 의해 구현 될 수있는 모델을 제공하는 서문을하지 않고,에 StackOverflow에 데이터 모델링 서비스를 제공하기 위해서는. 이미 단순화 및 집행의 일반적인 수준을 포함합니다. 어떤 질문이 있으면, 그냥 물어, 당신은 받아야한다.
우리는 링크 된 문서의 예를 들어 그래픽과 완전히 IDEF1X 호환 센서 데이터 모델 모두 사용할 수 있습니다
관계형 모델링 표준에 익숙하지 않은 독자는 IDEF1X 표기법이 유용 할 수있다. 데이터베이스를 생각하는 독자는 객체 클래스에 매핑 될 수 있으며, 서브 클래스는 더 읽는 것은 부상을 입을 수 있다는 것을 권장합니다. 이 파울러와 엠 블러 읽고보다 더입니다.
baseType 여기서-하위 유형 구조의 두 가지 유형이 있습니다.
독점 수단은 하나 각 baseType 여기서 행에 대해 하나의 하위 유형 행이 있어야합니다. IDEF1X 조건에서, 존재 서브 타입 로우를 식별 baseType 여기서,에 discriminator 컬럼이 있어야한다.
나는 세부 사항의 각 측면을 취할 것입니다.
baseType 여기서 (부모) 두 개 이상의 하위 유형을 호스팅 할 수 있습니다 (어린이)
더욱 상세와; 세부 사항을 포함하여 다이어그램 개요; 및 하위 유형 및 옵션 열 테이블 사이의 구별이 하위 유형의 문서를 참조하십시오.
이 부분은 언급하지 않은 모든 독자에 의해 건너 뛸 수 있습니다.
불행하게도, 어떤 사람들은 그래서 올바른 방법으로 명확하게 지시하는 경우에도, 그들은 그것을 이해할 수없는, 엄청난 추가 비용 (이 공간에서 "이론가"를 통과 괴물에 의해 권고로) 가지 길을 잘못하고 교육하고있다. 적절한 교육이 질문 및 답변 형식으로 치환 될 수없는 이유 아마도 때문입니다.
예. 이 방법은 하나, 키, 또는 어떤 관련이없는 테이블의 열, 또는 두통을 변경하는 UPDATE를 사용하여 다른 사람을 방해하지 않습니다. 그것은 특정 질문, 그리고 아무것도 대답을 제공합니다. 특정 DML 명령 또는 무엇이든을 방지하고자하는 경우, 그 목적을 위해 설계된 SQL 기능을 사용합니다. 이 모든 질문의 범위를 벗어나는 방법입니다. 그렇지 않으면 모든 대답은 모든 관련이없는 문제를 해결해야한다.
대답. 우리는 1993 년부터 사용 가능한 개방형 아키텍처 표준을 이용해야하기 때문에, DB에 대한 모든 변경 사항은, ACID 트랜잭션을 통해입니다. 그 말 직접 INSERT / UPDATE / DELETE, 모든 테이블이 금지에; 데이터 무결성 및 일관성 (ACID 용어)를 유지한다. 그렇지 않으면, 물론, 당신은 당신의 예와 같이 출혈이 엉망이있다. 및 결과. 그 괴물들은 삭제 / 오직 하나의 파일 INSERT / UPDATE를 이해하고, 거래를 이해하지 않습니다. 다시, 아웃 - 범위. 당신이 더 많은 정보가 필요한 경우, 새로운 질문을 열고, 나는 상세하게 답변 드리겠습니다.
또한, FK + 중복 D + 중복 지수 (그 안에! 대규모 비용) 종류의 아무것도하지 않는다, 나는 당신이 가지고 곳에서 "보인다"모른다.
여기서 문제는 두 가지입니다. 다른 지역은 관계형 데이터베이스와 오픈 아키텍처 표준 재에서 첫 번째, 당신은 기본 교육이 필요합니다. 둘째, 당신은 해제 프로그램을 필요, 내가 당신에게 대답을 주었다하더라도, 당신이 그것을 이해하지 않기 때문에, 당신은 노예이 특정 방법은 대규모 비효율적 인 컬트 방법은 무엇을하지 않습니다, 숭배 만트라를 반복하고 있습니다. 새 질문을 열고, 따라서 당신은 분명히 (관계형 데이터베이스의 기초를 이해 날짜 및 다웬 숭배 아무도)를 이해하지 않는 관계형 데이터베이스의 다른 지역에 대한 완전한 해답을 제공하기 위해 내 요청을 반복 짧은, 정말이야 어떻게 해야할지.
좋아, 짧은 대답, 그건 정말 독점 하위 유형의 차별이 잘못된 UPDATE에서 보호되는 방법 또 다른 질문에 속해?
-
==============================
2.두 번째 옵션은 문제를 내포이다 - 예를 당신이 기본 테이블이 없기 때문에 당신이 하위 모든 걸쳐 문제의 키에 klugey 메커니즘을 사용하지 않는 센서 (및 SensorNo는 대리 키라고 가정)를 들어, SensorNo 대리는 서브 클래스 테이블 사이 중 유일하지 않다 클래스 테이블 (또는 GUID를 사용).
두 번째 옵션은 문제를 내포이다 - 예를 당신이 기본 테이블이 없기 때문에 당신이 하위 모든 걸쳐 문제의 키에 klugey 메커니즘을 사용하지 않는 센서 (및 SensorNo는 대리 키라고 가정)를 들어, SensorNo 대리는 서브 클래스 테이블 사이 중 유일하지 않다 클래스 테이블 (또는 GUID를 사용).
당신이 사용자 인터페이스 센서 '콤바인'다른 유형, 예를 들어이 있다면이 증폭 될 것이다 아날로그 및 스위치 센서의 조합을 보여주는 목록입니다.
난 당신이 첫 번째 패턴을 유지하는 것이 좋습니다 다음 잘 테스트, 트랜잭션 코드이 테이블의 삽입 및 유지 보수를 캡슐화합니다.
예를 들면 작업 단위에 따라 각 서브베이스와 레코드를 삽입하는 다양한 서브 테이블에 대한 삽입 절차를 만든다. 그런 다음, 따라서 SPROC의를 통해 삽입 강제 테이블의 모든에 INSERT 권한을 취소함으로써 더 갈 수 있습니다.
당신은 또한 당신의 상속 구조의 어떠한 위반은 없었다고 확인 매일 무결성 보고서를 실행할 수 있습니다.
from https://stackoverflow.com/questions/4896831/how-to-implement-referential-integrity-in-subtypes by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL PIVOT 및 문자열 연결 집계 (0) | 2020.04.26 |
---|---|
[SQL] MySQL은 # 1093 - 당신은 FROM 절에서 업데이트 대상 테이블 '경품'을 지정할 수 없습니다 (0) | 2020.04.26 |
[SQL] 엔티티 프레임 워크 - 저장 프로 시저의 반환 값 (0) | 2020.04.26 |
[SQL] 정규 표현식은 일반 SQL 구문에 맞게? (0) | 2020.04.26 |
[SQL] 어떻게 SQLite는 TIMESTAMP 값을 비교 (0) | 2020.04.26 |