2011-01-20 5 views
0

에 합류 내가 네, 복합 ID입니다 ( NHibernate에 계층 구조

User.Id --> UserProject.Id.UserId 
      UserProject.Id.ProjectId --> Project.Id 

UserProject를 통해

Project1.Projects 
    +- Project1.1 
    +- Project1.2 
Project2.Projects 
    +- Project2.1 
    +- Project2.2 
Project3.Projects 
    +- Project3.1 

사용자가 프로젝트에 대한 사용 권한을 할당 계층 구조 프로젝트을 가지고, 미안 ... 레거시 데이터베이스, 당신은 무엇을 할거야 ...)

지금, 나는 모든 상단의 목록이 필요합니다. 특정 사용자가 프로젝트 에 액세스하거나 서브 프로젝트 중 하나 이상에 액세스 할 수있는 프로젝트 사용자 A가 Project1의 및 Project3.1에 액세스 할 수있는 경우

은 그래서 바람직하게는 사용자가 프로젝트 3에 대한 권한이없는 몇 가지 정보와 Project1의 및 프로젝트 3 (하지 3.1)를 포함하는 목록을 얻을합니다.

는 데이터베이스에서 프로젝트는 부모 링크와 함께 평면 저장됩니다

Project: 
| Project_ID | Parent_project_id | HasSubProjects | ... | 

UserProject 
| ProjectID | UserId | other properties... | 

어떤 제안을 내가 원하는 것을 다시 얻을 수있는 효과적인 방법에?

업데이트 : 유니온 및 계층 적 조인을 사용하여 방대한 SQL 문을 작성했습니다. 꽤 짐승. 도와 줘서 고마워. '

select ProjectID from UserProject u 
inner join Project p 
     on u.ProjectID = p.Project_ID 
start with UserId = @foo 
connect by prior Parent_Project_id = Project_ID 

내가 돈 :

답변

1

은 당신이 이전하여 연결, 프로젝트 테이블 위에 당신의 연결 테이블을 결합하여 사용자가 직접 액세스 할 수있는 설정으로 시작한 다음 사용하여 트리를 탐색 할 생각 이 부분을 테스트 할 것이므로 구문 오류가있을 수 있지만 사용하려는 기본적인 아이디어입니다.

+0

그는 CreateSQLQuery()를 사용해야 할 것입니다. 왜냐하면 NHibernate가'start with ... by connect'로 재구성하지 않을 것이기 때문입니다. 그것은 데이터베이스에 얼마나 큰지에 따라 수동으로 트리를 이동할 수 있습니다. – Mike

+0

구문 오류가 없지만 거의 모든 UserProject 레코드가 데이터베이스에 반환되었으므로 (8.904.856 of 8.973.093) 거기에 문제가 있습니다. :) 좀 더 자세히 살펴 보겠습니다. 몇 가지 별도의 조회 및 계산. 그래도 "사전에 연결"을 들어 본 적이 없지만 감사합니다! 오늘도 새로운 것을 배웠습니다. – henriksen

+0

좋은 지적 마이크. '이전 연결'은 오라클 특정 구문입니다. 따라서 오라클 태그를 가정하면 백엔드에 오라클이 있다는 의미이므로 PL/SQL 등을 사용하여 실행할 수 있어야합니다. – dataduck