하나의 기술에 대한 DDL을 사용하는 방법에 대한 조언을 부탁드립니다 것은 일종의을 사용하는 것입니다 '하드 코딩 된'EAV 패턴. 끊지 마! 그것은 당신이 이야기하고 실제로 EAV를 사용하지 않은 데이터 세트 크기로 잘 작동했습니다 - 그것은 EAV-esque뿐이었습니다.
아이디어는 이러한 사용자 정의 속성을 아래에 설명 된 일부 트리거와 함께 저장하는 테이블 세트를 갖는 것입니다. 사용자 지정 특성 테이블 세트는 특성 (어떤 테이블과 함께 사용되는지, 데이터 형식, 제약 조건 등)에 대한 메타 데이터를 저장합니다. 당신은 이것에 아주 공상을 얻을 수있다 그러나 나는 필요를 haev이지 않았다.
메타 테이블의 트리거를 사용하면 기본 + 확장자를 DB 내의 첫 번째 클래스 개체로 롤업하는보기가 다시 생성됩니다. 따라서 테이블 person + employee 확장 테이블 대신에 두 가지를 모두 포함하는 employee 뷰가 있습니다. 새 값을 사용자 지정 특성 테이블에 놓으면 트리거가 뷰를 다시 롤링하고 새 내용을 포함합니다. 견본을 원한다면 트리거가 저장 프로 시저를 다시 작성할 수도 있습니다. 중간 계층 코드의 구조에 따라 일부 코드를 다시 코딩해야하지만이 경우 데이터를 읽는 규칙을 적용해야합니다.
테스트에서 필자는 비교적 적은 수의 레코드에 대해 성능이 다소 느리지 만 거의 동일한 패턴의 저하 (레코드 수의 2 배, 느린 속도의 2 배)를 따랐습니다.
- 편집 -
나는 그것이 첫 번째 클래스 개체를 나타내는 표, '사람'과 대한 행 '직원'등 우리는거야에 대한 그래서 행을 가지고 수행 보았다 어떻게
FCO에 전화 해. 그런 다음 FCO를 나타내는 테이블을 저장 한 보조 테이블이 있습니다. 그 사람을 Srcs라고 부를 것입니다. 사람에게는 한 행, 사람 테이블이 있습니다. Employee에는 person 테이블과 Employee 확장이라는 두 행이 있습니다.Attribs라는 세 번째 테이블은 FCO를 구성하는 테이블의 열을 저장합니다. 간단히 말하면, Employee는 ID, Name, Address를 가지고 있고, Employee는 Employee와 Department를 가지고 있으며 Person 테이블은 Person 테이블을 참조하고 있음을 알 수 있습니다. 따라서 FCO 테이블 (사람과 직원)의 2 행, Src 테이블의 3 행, Attribs의 8 행.
보기에서는 vw_Employee라고하고 두 테이블에서 PersonID, 이름, 주소, 고용 날짜, 부서를 선택합니다. OnMetadataChange라고 부르는 SQL 저장 프로 시저에 의해 만들어졌습니다.
이 SP는 트리거 또는 배치 프로세스에 의해 실행되며 CREATE VIEW 문을 생성하는 것이 목적입니다. 모든 퍼스트 클래스 객체를 반복하고 뷰를 구성하는 테이블의 필드를 수집하며이를 기반으로 CREATE 문을 발행합니다. OnMetadataChange는 각 뷰에 대해 DROP 및 CREATE를 생성하므로 FCO 테이블의 항목마다 한 번 실행되는 동적 SQL 문을 생성합니다. 이 작업은 트리거로 수행하는 것이 좋지만 반드시 필요한 것은 아닙니다. 다행히도 FCO 정의가 너무 자주 변경되지는 않을 것이며, 그렇게되면 코드 배포가있을 것입니다. 이 때 OnMetadataChange SP를 실행할 수 있습니다.
최종 결과는 2 계층 데이터베이스입니다. 뷰는 응용 프로그램에 의미있는 First Class Object 레이어를 구성합니다. 응용 프로그램은보기 만 사용합니다. 테이블은 응용 프로그램이 신경 쓰지 않아야하는 '물리적'계층을 구성합니다. 메타 테이블은 본질적으로 FCO 계층과 실제 계층 사이의 매핑입니다. 설정하는 데는 시간이 걸리지 만 EAV의 많은 이점을 제공하는 동시에 3nf 테이블 (인덱서 빌리티 등)의 구체적인 이점을 제공하므로 매우 효과적입니다.
원한다면 거기에 몇 가지 샘플 SQL을 던질 수 있습니다.
EAV가 성능 때문에 왜 자동으로 문제가 될 것이라고 생각하십니까? http://sqlblog.com/blogs/aaron_bertrand/archive/2009/11/19/what-is-so-bad-about-eav-anyway.aspx http://sqlblog.com/blogs/merrill_aldrich/archive/2009 /11/20/wrinkly-entropy.aspx –
위에서 언급 한 바와 같이 플랫 디스플레이는 큰 요구 사항이며 블로그 링크와 같이 "고객의 일련의 속성 값을 한 행에 모두 반환하는 것은 쉽지 않습니다." – Kumar
"사소하지 않음 "은 반드시"느리게 "는 것을 의미하지 않습니다. –