에 합류 내가 네, 복합 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
내가 돈 :
그는 CreateSQLQuery()를 사용해야 할 것입니다. 왜냐하면 NHibernate가'start with ... by connect'로 재구성하지 않을 것이기 때문입니다. 그것은 데이터베이스에 얼마나 큰지에 따라 수동으로 트리를 이동할 수 있습니다. – Mike
구문 오류가 없지만 거의 모든 UserProject 레코드가 데이터베이스에 반환되었으므로 (8.904.856 of 8.973.093) 거기에 문제가 있습니다. :) 좀 더 자세히 살펴 보겠습니다. 몇 가지 별도의 조회 및 계산. 그래도 "사전에 연결"을 들어 본 적이 없지만 감사합니다! 오늘도 새로운 것을 배웠습니다. – henriksen
좋은 지적 마이크. '이전 연결'은 오라클 특정 구문입니다. 따라서 오라클 태그를 가정하면 백엔드에 오라클이 있다는 의미이므로 PL/SQL 등을 사용하여 실행할 수 있어야합니다. – dataduck