문제

MS SQL Server 2005를 사용하고 있습니다.

위키 같은 시스템에 가장 적합한 스키마는 무엇입니까? 사용자가 제출물을 편집/수정하고 시스템이 이러한 제출물을 추적하는 경우.

우리가 간단한 위키 기반 시스템을하고 있다고 가정 해 봅시다. 각 개정판 및 각 개정의 최신 활동을 추적합니다. 다른 화면에서 시스템은 "최신 제출물"및 "Most -Vewed"와 제목 별 검색을 나열합니다.

내 현재 스키마 (그리고 나쁘다는 것을 알고 있음)는 단일 테이블을 사용하고 있습니다. "최신 제출물"을 볼 필요가있는 경우 "최신 Activity"로 정렬 된 "DocumentTitle"으로 그룹을 한 다음 첫 번째 N 레코드를 가져옵니다. 나는 많은 그룹화 (특히 Nvarchar에 그룹화)가 나쁜 소식이라고 생각합니다. 가장 많이 볼 수있는 목록을 표시하려면 다음과 같은 작업도 동일합니다.보기별로 정렬, 이름별로 그룹, 첫 번째 N 레코드를 가져 가십시오. 대부분의 경우, 나는 또한 "%query-here%'와 같은 문서화 이름"을 수행 할 것입니다.

내 현재 스키마는 "버전 1"입니다. 아래를 참조하십시오.Alt Text http://www.anaimi.com/junk/schemaquestion.png

나는 이것이 허용되지 않는다고 생각합니다. 그래서 저는 또 다른/더 성능있는 디자인을 생각해 내려고 노력하고 있습니다. 버전 2는 어떻게 당신에게 소리가 나오나요? 버전 2에서는 숫자 인 wikiheadid에서 그룹화의 이점을 얻습니다. 숫자를 통해 그룹화하는 것이 Nvarchar보다 낫다고 가정합니다.

또는 버전 3 인 극단적 인 경우는 그룹화를하지 않지만 값 복제, 코드에서 이러한 값 유지 등과 같은 몇 가지 단점이 있습니다.

또는 그러한 시스템에 더 나은/알려진 스키마가 있습니까?

감사.

(ServerFault에서 이동 - IT 질문보다 개발 질문이라고 생각합니다)

도움이 되었습니까?

해결책

첫째, (그리고 호기심에서) 현재 스키마는 현재 버전의 내용을 어떻게 표시합니까? 동일한 Documenttitle과 함께 여러 'Wikidocument'항목이 있습니까?

또한 버전 수준에서 왜 '최후의 행동'이 필요한지 분명하지 않습니다. 나는 'lastactivity'가 '버전'의 개념에 어떻게 어울리는 지 모르겠습니다. 대부분 Wikis, '버전'은 쓰기 온스입니다. 버전을 수정하면 새로운 버전, 따라서 버전의 마지막 업데이트 된 유형 값의 개념은 의미가 없습니다. 실제로 'DateCreated'입니다.

실제로 디자인의 '천연'스키마는 #2입니다. 개인적으로, 나는 오래된 DB 공리의 팬입니다. #2는 더 깨끗하고 더 좋은 디자인 (단순하고 복제가없는)이며, 버전 3에 대해 비정상화 할 긴급한 이유가 없다면 귀찮게하지 않을 것입니다.

궁극적으로, 그것은 이것에 달려 있습니다 : 당신은 성능 문제를 관찰했거나 가설 적으로 '더 성능적인'디자인에 대해 걱정하고 있습니까? ~할 것 같다 일부가 있습니까? #2가 잘 수행되지 않아야 할 실제 이유는 없습니다. 그룹화는 SQL Server에서 반드시 나쁜 소식은 아닙니다. 실제로 쿼리에 대한 적절한 커버링 인덱스가있는 경우 색인의 특정 레벨로 이동하여 그룹화 된 값을 찾은 다음 사용하기 때문에 매우 잘 수행 할 수 있습니다. Min/Max/무엇이든 사용할 인덱스의 나머지 열. Nvarchar에 의한 그룹화는 특히 나쁘지 않습니다. 문제가되는 것으로 관찰되지 않으면 문제를 걱정하지 마십시오 (이진이 아닌) 콜로레이션은 조금 까다로워 질 수 있지만 버전 2에서는 필요한 곳에 있습니다. Wikiheadid가 할 수 있습니다. 맞습니까?

현재 버전에서 많은 작업을 수행하면 (내가 가정했던 것처럼) 헤드 테이블에서 바디 테이블에 FK를 추가하여 현재 버전을 나타내는 삶을 더 쉽게 만들 수있는 한 가지. 당신이보고 싶다면 현재 버전 가장 많은 히트 곡으로 #2로 지금은 다음과 같습니다.

SELECT TOP ...
FROM WikiHead
INNER JOIN 
  (SELECT WikiHeadId, MAX(WikiBodyVersion) /* or LastUpdated? */ AS Latest 
   FROM WikiBody GROUP BY WikiHeadId) AS LatestVersions
INNER JOIN WikiBody ON 
  (Latest.WikiHeadId = WikiBody.WikiHeadId)
  AND (WikiBody.WikiBodyVersion = LatestVersions.Latest)
ORDER BY 
  Views DESC

또는 대안 적으로

...
INNER JOIN WikiBody ON 
  (WikiHead.WikiHeadId = WikiBody.WikiHeadId)
  AND (WikiBody.WikiBodyVersion = 
    (SELECT MAX(WikiBodyVersion) FROM WikiBody WHERE WikiBody.WikiHeadId = WikiHead.WikiHeadId)
...

둘 다 icky입니다. Wikihead가 현재 버전에 대한 포인터를 유지하면

...    
INNER JOIN WikiBody ON 
  (WikiHead.WikiHeadId = WikiBody.WikiHeadId)
  AND (WikiHead.Latest = WikiBody.WikiBodyVersion)
...

또는 무엇이든, 그것은 유용한 탈피가 될 수 있습니다.

다른 팁

확인하다 이것 밖으로.

데이터베이스 스키마입니다 미디어 위키, Wikipedia의 기반.

그것은 꽤 잘 문서화되어 보이며 당신을위한 흥미로운 읽기가 될 것입니다.

이것으로부터 페이지.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top