2009-05-03 1 views
0

우리는 연방 의미 네트워크 (RDF, Protege 등)를위한 RDBMS 기반 웹 사이트를 구축하고 있습니다. 이것은 기본적으로 각각 다른 노드와의 (그리고 그 노드로부터) 명명 된 관계의 크고 불명확 한 집합을 갖는 많은 노드 모음입니다.시맨틱 네트워크 노드에 대한 SQL 데이터 모델을 권장합니까?

내 생각은 모든 노드 (이름, 설명 등)에 대한 단일 테이블과 명명 된 관계 당 하나의 테이블입니다. 더 좋은 아이디어가 있습니까?

답변

0

아니요, 괜찮을 수 있습니다. 성능이 좋도록 기본 키와 인덱스에주의하십시오.

0

노드에 대한 단일 테이블이 없다면 많은 관계 테이블을 정의해야합니다. 각각의 새 노드 유형은 인 새 관계 테이블을 필요로합니다. 모든 노드는 이전 노드 유형입니다. 그렇게 빨리 빠져 나올 수 있습니다.

그래서 단일 테이블이 가장 좋게 들립니다. 특정 노드 유형에 대해 추가 필드가 필요한 경우 항상 1 : 1 관계를 사용하여 필드를 확장 할 수 있습니다.

1

더 자세히 살펴보면 노드 (ID, 이름, 설명) 및 기타 관계 (ID, 이름, 설명, 시작에서 끝까지)에 대해 두 개의 테이블이있을 수 있습니다. 여기서 from 및 two는 노드 테이블 (ints). 아직도 바른 길에 있니?

+0

처음부터 두 개의 테이블을 원한다고 생각했습니다. 텍스트를 "더하기 관계가있는 테이블 하나 더하기"로 잘못 읽었습니다 ...;) 어쩌면 관계 당 하나의 테이블이 원하는 방식이 아닙니다. go (추가 속성이있는 매우 특정한 관계 유형이 거의없는 경우는 제외). – Lucero

+0

죄송합니다. 도와 주셔서 감사합니다!! –

+0

미안 할 필요가 없습니다. 나는 방금 독서를하고있었습니다 ... – Lucero

0

SQL Server 2008을 사용하는 경우 새로운 HierarchyID datatype을 계층 구조를 저장하는 것으로 간주 할 수 있습니다. 저장소에 최적화되어 있습니다.

1

관계 당 2 행을 작성하여 성능을 최적화 할 수 있습니다.

테이블 항목과 테이블 관계가 있고 사람 A가 사람 B와 관계가 있다고 가정 해 봅시다. 관계 테이블에는 항목을 나타내는 왼쪽과 오른쪽 열이 있습니다.

SELECT * FROM Relations WHERE LeftItemId = @ItemId OR RightItemId = @ItemId 

을 OR이 쿼리의 성능을 파괴 할 것입니다 : 당신은이 관계에 대해 하나 개의 행이 있고, 당신이 특정 항목에 대한 모든 관계를 원한다면 지금,이처럼 보이는 쿼리를 할 것이다! 당신이 행을 복제하고 관계를 전환 할 경우 쿼리는 다음과 같습니다 (좌우 반대의 경우도 마찬가지가됩니다) :이 일이 엄청나게 빨리 갈 것입니다 올바른 인덱스

SELECT * FROM Relations WHERE LeftItemId = @ItemId 

합니다.

관련 문제