잠시 동안 연구했지만 적절한 대답을 얻을 수없는 데이터베이스 디자인 문제가 있습니다. 이제 우리는 다음과 같은 두 개의 테이블 house_schema
및 house
있다고 가정 해 봅시다 : house
의다른 테이블의 속성을 저장하는 하나의 테이블에서 레코드 삭제
house_schema {
id big int,
house_height int,
house_width int,
house_decoration vchar(1024),
build_date timestamp,
primary key id,
}
house {
id big int,
owner vchar(255),
price big int,
house_schema_id big int,
primary key id,
foreign key fk_house_house_schema_id (`house_schema_id`) reference `house_schema`.`id`
}
house_schema
테이블에는 몇 가지 물리적 특성. 소프트웨어 UI에서 사용자는 스키마를 선택한 다음 "빌드"버튼을 클릭합니다. 주택은 건설되어 house
에 저장됩니다. 주택 건설 방법을 설명하는 house_schema
과 같은 다른 테이블이 있습니다.
단순한 디자인으로 외장 키가 잘 작동하는 것처럼 보입니다. 그러나 빌더가 오래되었다고 생각하는 스키마를 제거하기로 결정하면 문제가 발생합니다. 이미 스키마에서 빌드 된 일부 집이 있으며 외래 키로 삭제할 수 없습니다. 외래 키를 DELETE ON CASCADE
으로 변경하면 해당 주택은 그것이 구축 된 정보를 잃게됩니다.
이 문제를 해결하는 가장 좋은 디자인 패턴은 무엇입니까? 내가 상상할 수있는 것은 house_schema
이라는 중복 테이블을 가지고있는 것입니다. 집이 만들어지면 house_schema
에있는 행을 복제 테이블에 복사하십시오.
그러나 house_schema
과 유사한 테이블이 여러 개 있기 때문에 데이터베이스에 중복 테이블이 많이 생깁니다. 그것은 데이터베이스 정규화 규칙을 위반하는 것 같습니다.
누구에게 좋은 생각이 있습니까?
집을 짓기 전에 스키마를 구성하기 때문에 스키마를 별도의 테이블에 저장합니다. 사용자가 구성을 선택하면 집이 구성되어 이제 구성이 집의 속성이됩니다. 하지만 그 전에는 집이 있기 때문에 어쨌든 속성이 아닙니다. –