다양한 유형의 활동을 사이트와 연결하는 응용 프로그램을 상속했습니다. 대략 100 개의 서로 다른 활동 유형이 있으며 각 활동 유형에는 3-10 개의 필드가 다릅니다. 그러나 모든 활동에는 하나 이상의 날짜 필드 (날짜, 시작 날짜, 종료 날짜, 예정된 시작 날짜 등의 조합 일 수 있음)와 하나의 책임자 필드가 있습니다. 다른 모든 필드는 매우 다양하며 시작 날짜 필드는 반드시 "시작 날짜"라고 할 필요는 없습니다.
각 활동 유형마다 하나의 부속 유형 테이블을 작성하면 100 개의 서로 다른 부속 유형 테이블이있는 스키마가 생성되므로 처리하기가 너무 어려워집니다. 이 문제점에 대한 현재 솔루션은 활동 값을 키-값 쌍으로 저장하는 것입니다. 이것은 현재 시스템의 요점을 쉽게 이해할 수있는 스키마입니다.
각 활동에는 여러 개의 ActivityField가 있습니다. 각 사이트에는 여러 활동이 있으며 SiteActivityData 테이블은 각 SiteActivity에 대한 KVP를 저장합니다.
이렇게하면 (웹 기반) 응용 프로그램을 매우 쉽게 코딩 할 수 있습니다. 실제로 필요한 것은 지정된 활동에 대해 SiteActivityData의 레코드를 반복하고 각 행의 레이블 및 입력 제어를 양식에 추가하기 때문입니다. 그러나 많은 문제가 있습니다.
- 무결성은 나쁘다. 활동 유형에 속하지 않는 필드를 SiteActivityData에 넣을 수 있으며 DataValue는 varchar 필드이므로 숫자와 날짜를 지속적으로 캐스트해야합니다.
- 이 데이터의보고 및 임시 쿼리는 어렵고 오류가 발생하기 쉽고 속도가 느립니다. 예를 들어, 지정된 범위 내에 종료 날짜가있는 특정 유형의 모든 활동 목록을 가져 오려면 피벗 및 varchar를 날짜로 캐스트해야합니다. 보고서 작성자는이 스키마를 싫어하고 비난하지 않습니다.
그래서 내가 찾고있는 것은보고를 쉽게하는 방식으로 거의 공통점이없는 많은 활동을 저장하는 방법입니다. 내가 지금까지 생각해 낸 것은 XML을 사용하여 활동 데이터를 의사 noSQL 형식으로 저장하는 것입니다.
활동 테이블에는 각 활동에 대한 XSD가 포함되므로 ActivityField 테이블이 필요하지 않습니다. SiteActivity는 키-값 XML을 포함하므로 사이트의 각 활동이 이제 단일 행에있게됩니다.
액티비티는 다음과 같이 보일 것입니다 (그러나 나는 그것을 완전히 이해하지 못했습니다).
<SomeActivityType>
<SomeDateField type="StartDate">2000-01-01</SomeDateField>
<AnotherDateField type="EndDate">2011-01-01</AnotherDateField>
<EmployeeId type="ResponsiblePerson">1234</EmployeeId>
<SomeTextField>blah blah</SomeTextField>
...
장점 :
- XSD는 XML을 검증하여 데이터베이스 수준의 숫자 필드에 문자열을 넣는 것과 같은 오류를 포착합니다. varchar에 모든 것을 저장 한 이전 스키마로는 불가능했습니다.
- 웹 양식을 작성하는 데 사용되는 KVP 레코드 세트를 사용하여 쉽게 재현 할 수 있습니다.
select ... from ActivityXML.nodes('/SomeActivityType/*') as T(r)
- XML의 xpath 서브 쿼리는 피벗을 사용하지 않고 시작 날짜, 종료 날짜 등에 대한 열이있는 결과 세트를 생성하는 데 사용될 수 있습니다.
select ActivityXML.value('.[@type=StartDate]', 'datetime') as StartDate, ActivityXML.value('.[@type=EndDate]', 'datetime') as EndDate from SiteActivity where...
이것이 좋은 생각처럼 보입니까? 다른 많은 속성 집합을 저장하는 다른 방법을 생각할 수 없습니다. 내가 가진 또 다른 생각은 기존 스키마를 유지하고 데이터웨어 하우스에서 더 쉽게 쿼리 할 수있는 것으로 변환하는 것이었지만, 이전에는 스타 스키마를 설계 한 적이 없으며 어디서부터 시작해야할지 전혀 몰랐습니다.
추가 질문 :을 사용하여 XSD에 날짜 데이터 유형이있는 것으로 태그를 정의하면 xs:date
SQL Server가 태그를 날짜 값으로 색인화합니까? 날짜별로 쿼리하면 날짜 문자열을 날짜 값으로 캐스팅하고 색인을 사용할 가능성을 날려야합니다.