2011-10-31 2 views
3

저는 고전적인 문제의 형태는 직원이 있고 직원에게 관리자가있어서 관리자가 관리자가 아니라면 관리자가 아니라고 생각합니다.데이터베이스에 트리 데이터를 저장하는 모범 사례

어떻게 데이터를 저장하나요? 해결 방법 1 : 직원 테이블에 manager_id가 있거나 employee_manager 테이블을 가질 수 있습니다 (관리자가 많거나 적음).

SQL이 재귀를 지원하지 않고 직원 위의 모든 관리자를 찾을 수있는 쿼리가 없기 때문에 솔루션 1이 좋지 않다고 말하는 사람들이 있습니다. 이 사람들에게는 대안 아이디어가 있습니다 (예 : 직원이 관리자 목록을 가지고있는 것처럼) 그러나 모두 유지 관리가 매우 어려운 표준화되지 않은 데이터의 혼란이 포함 된 것처럼 보입니다.

그래서 모두 어떻게 생각하십니까?

+0

[공통 테이블 표현식] -

주요 관심사는 데이터베이스가에서 좋은 일을 할 수 있도록해야한다 -table-expression/info)는 ANSI-99 SQL 표준의 일부이며 재귀 쿼리를 수행 할 수있는 기능을 제공합니다. – Allan

답변

4

다른 사람들과 동의합니다. 재귀가 가능합니다.

나는 SCOTT/TIGER 고대의 지혜에도 불구하고 emp 테이블에 manager_id를 두지 않을 것입니다. 현실 세계는이 비즈니스 규칙을 항상 깨뜨리고 잘 정규화되지 않았습니다.

대신 person_to_person 유형 링크 테이블을 생각해보십시오. 예를 들어, person1은 1 월에서 3 월까지 person2와 관리자로 관련됩니다. 이를 통해 어느 시점에 여러 관리자가있는 상황에서도 시간을 통해 프로젝트, 부서, 임의 그룹에 사람들을 할당하는 데 큰 유연성을 얻을 수 있습니다.

또한 부서 관계에 대한 사람들이 비슷하다는 것을 고려하십시오. 사람들은 미묘한 방식으로 여러 부서와 동시에 관련 될 수 있습니다.

3

가장 많이 사용되는 SQL 데이터베이스 do은 재귀 쿼리를 지원합니다.

  • 대부분의 데이터베이스는 recursive CTEs을 지원합니다.
  • 오라클은 CONNECT BY도 지원합니다.
  • MySQL은 불행히도 지원하지 않습니다.
1

일부 데이터베이스에는 오라클의 CONNECT BY 구문과 같은 재귀 쿼리가 있습니다. 그럴 경우 분명히 1을 선택하게 될 것입니다.

비록 그렇지 않더라도, 실제로 데이터의 구조라면 모든 사람에게 관리자를 제공하면 데이터가 더 깨끗해집니다. 모든 관리자를 CEO에게 알리려면 여러 쿼리를 실행해야합니다. 그렇지 않으면 모든 데이터를 가져와 사용중인 프로그래밍 언어로 트리를 작성해야합니다. 그러나 모든 사람이 관리자 목록을 얻는다면 똑같은 문제가 발생합니다. 이 데이터에서 트리를 작성하려면 프로그래밍 인텔리전스가 필요합니다. 오라클이 없다면 말입니다. ;)

그건 그렇고, 나는 부서 목록을 만들고 각 부서에 관리자를 부여 할 것입니다. 그렇게하면 직원을 업데이트하지 않고도 사람 (심지어 관리자)을 다른 위치에보다 쉽게 ​​배치 할 수 있습니다. 일반적으로 관리자는 부서를 관리하므로 다른 사람들의 관리자 일뿐입니다. 해당 부서에서 일하기 때문입니다.

2

데이터의 무결성 제약 조건을 어디에 적용할지, 어디서 쿼리 할 것인지/할 일을 결정해야합니다.

다른 언급했듯이 일부 데이터베이스 서버는 재귀 쿼리를 지원하지 않습니다. 그러나 데이터베이스를 쿼리하고 코드로 트리를 작성한다면 이는 논쟁의 여지가 있습니다.

비록 당신이 SQL에서 그렇게 할 수있다해도 - 정말로하고 싶습니까? SQL은 어떤 것에는 적합하지만 모든 것에 적합하지는 않습니다. http://stackoverflow.com/tags/common (이 경우, 해결 방법 같은 소리 1.

관련 문제