2009-12-18 4 views
1

우리가 가진이 작업의 해결 방법을 도울 수 있기를 바랍니다. 우리가 지금 필요한 것은이 방식으로 데이터를 제공하는 기능 (따라 hwtype) hwtype.name에 대한동적 SQL 피벗 테이블

= 라우터

element speed IP 
RTR1  100mb 172.16.3.23 
RTR2  10mb 172.16.3.26 

hwtype 
id name 
1 router 
2 switch 

hwelement 
id idhwtype name 
1 1   RTR1 
2 1   RTR2 
3 2   SWT1 

hwattributes 
id idhwtype name 
1 1  speed 
2 1  IP 
3 2  ports 

hwtypeattributes 
id idhwelement idhwattribute value 
1 1    1    100mb 
2 1    2    172.16.3.23 
3 2    1    10mb 
4 2    2    172.16.3.26 
5 3    3    8 

:

는 원래 우리는이 테이블을

아이디어는 테이블을 수정하지 않고도 새로운 요소 유형, 요소 및 특성을 테이블에 포함 할 수있게 만드는 것입니다.

저는 예제를 찾고 있었지만 불행히도 제가 고려하지 않은 값에 대한 집계를 수행하는 좋은 것들을 발견했습니다. 당신의 도움이

+4

. 예 : 'sql-server','oracle','mysql' 등입니다. 답은 중요합니다. –

+1

Entity-Value 아키텍처를 사용하여 데이터베이스를 변경할 필요가없는 시스템을 꿈꾸는 첫 번째 인물이 아닙니다. 안타깝게도 결국 결정을 저주 할 최후의 대우가되지는 않을 것입니다. (아키텍처를 변경하기에는 너무 늦지 않았다면 고려해야합니다. –

답변

0

당신은 EAV 안티 패턴을 사용하고 사전에

감사합니다. 이렇게하면 관계형 데이터베이스 디자인의 모든 종류의 규칙이 깨지고 데이터를 가져 오는 것은 매우 어색합니다. 이 디자인에는 다른 많은 약점이 있으며 다른 곳에서 다룰 수 있습니다.

"Bad CaRMa"EAV 시스템이 회사를 어떻게 파괴했는지에 대한 훌륭한 이야기를 읽으십시오. A에 대한 모든 속성을 가져 오는에 당신이 주장하는 경우 각 속성에 대한 을 조인의 추가 쌍을 필요

SELECT e.name AS "element", 
     speedval.value AS "speed", 
     ipval.value AS "IP", 
     portsval.value AS "Ports" 
FROM hwtype t 
JOIN hwelement e ON (e.idhwtype = t.id) 
JOIN hwattributes speed ON (speed.idhwtype = t.id AND speed.name = 'speed') 
LEFT OUTER JOIN hwtypeattributes speedval 
    ON (speedval.idhwattribute = speed.id AND speedval.idhwelement = e.id) 
JOIN hwattributes ip ON (ip.idhwtype = t.id AND ip.name = 'ip') 
LEFT OUTER JOIN hwtypeattributes ipval 
    ON (ipval.idhwattribute = ip.id AND ipval.idhwelement = e.id) 
JOIN hwattributes ports ON (ports.idhwtype = t.id AND ports.name = 'ports') 
LEFT OUTER JOIN hwtypeattributes portsval 
    ON (portsval.idhwattribute = ports.id AND portsval.idhwelement = e.id) 
WHERE t.name = 'router'; 

참고 : 여기에

는 라우터가 데이터베이스에서 속성을 얻기 위해해야 ​​할 일이다 하나의 행에 주어진 요소. 이렇게하면 SQL 최적화 프로그램에서 엄청나게 비쌉니다.

그것은 여러 행에 대한 특성을 가져, 응용 프로그램 코드에서 분류하는 훨씬 쉽게

: SQL에 대한 질문을 할 때 사용하는 RDBMS의 브랜드 태그를해야

SELECT e.name AS "element", a.name, v.value 
FROM hwtype t 
JOIN hwelement e ON (e.idhwtype = t.id) 
JOIN hwattributes a ON (a.idhwtype = t.id) 
JOIN hwtypeattributes v ON (v.idhwattribute = a.id AND v.idhwelement = e.id) 
WHERE t.name = 'router';