2016-12-01 1 views
0

조직, 위치, 부서 및 사용자가 포함 된 데이터베이스가 있어야하는 시스템을 구축하고 있습니다. 그들은 당신이 기대하는 것처럼 연결 : 각 조직은 하나 이상의 사용자 각 부서의 직장에서 하나 이상의 부서 조직/위치/부서/사용자를위한 최상의 DB 구조?

  • 를 포함 할 수있는 하나 이상의 위치
  • 각 위치 (건물)을 포함 할 수 있습니다

    • 사용자가 둘 이상의 부서에서 작업 할 수 있습니다.

    그러나 부서는 여러 위치에 걸쳐있을 수 있습니다.

    직관적으로 나는 다음과 같이 DB를 생성 할 것입니다 : circle 위에서 보았던 구조의 문제점은 BUT입니다; 2 개 지역에 걸쳐있는 한 부서를 가질 수는 없습니다. 나는 그것이 정말로 문제가 아니라는 것을 알았다. 왜냐하면 나는 두 곳의 동일한 부서를 간단히 만들 수 있기 때문이다. 이 부서의 관리자가있는 경우 두 곳의 관리자로 만 간단하게 지정할 수 있습니다.

    한 프로그래머는 비록 다른 구조를 제안 :

    tree 그가 아무것도 전체의 아무것도 걸쳐 방법이 더 유연 말한다 때문에 그는이 구조의 큰 팬이다. 내 문제는 그것이 수동으로 데이터베이스를 읽을 때 읽기 쉽지 않다는 것입니다. 게다가 코드를 작업 할 때 더 혼란 스럽습니다.

    내 질문은; 어떤 구조를 선호합니까? 이 마지막 구조에 큰 플러스는 무엇입니까? 더 자주 사용됩니까? 모든 팁을 환영합니다!

  • +0

    그래서 내가 무엇을 읽고있다하는 것은 당신이 작동 한 구조를 가지고있다, 그러나 읽기 위해 좀 더 열심히 할 수 있으며, 하나는 작동하지 않습니다 당신이 요구되는 일 우리는 더 좋아해요 ... 작동하는 사람과 같이 가십시오. – SaggingRufus

    +0

    @SaggingRufus - 음, 첫 번째 것은 제 의견으로는 더 읽기 쉽고 내 의견으로는 실제로 문제가되지 않는 한 가지 단점이 있지만 다른 하나는 만족할만한 것입니다. 모든 가능성에 대해,하지만 일을 매우 복잡하게 만듭니다. 내 질문은; 두 번째 DB 디자인이 많이 사용되었거나 프로그래머가 모호한 생각입니까? – kramer65

    +0

    @ kramer65 두 번째 디자인을 본적이 없습니다. 어쩌면 노란색 키가 기본 키인 경우 정상적인 형식이 아닐 수도 있습니다 (외래 키가 너무 많습니다). – pozs

    답변

    0

    가정 : 조직에는 여러 부서가 있고 부서에는 여러 위치가 있으며 사용자는 해당 부서 위치 중 하나에서 한 부서에 근무합니다.

    여기 내 빠른 스케치입니다 :

    CREATE TABLE Users 
    (user_id INTEGER NOT NULL UNIQUE); 
    
    CREATE TABLE Organizations 
    (org_id INTEGER NOT NULL UNIQUE); 
    
    CREATE TABLE Departments 
    (dep_id INTEGER NOT NULL UNIQUE); 
    
    CREATE TABLE Locations 
    (loc_id INTEGER NOT NULL UNIQUE); 
    
    CREATE TABLE OrgDepartments 
    (org_id INTEGER NOT NULL UNIQUE 
        REFERENCES Organizations (org_id), 
        dep_id INTEGER NOT NULL UNIQUE 
        REFERENCES Departments (dep_id)); 
    
    CREATE TABLE DepartmentLocations 
    (dep_id INTEGER NOT NULL UNIQUE 
        REFERENCES OrgDepartments(dep_id), 
        loc_id INTEGER NOT NULL 
        REFERENCES Locations (loc_id), 
        UNIQUE (loc_id, dep_id)); 
    
    CREATE TABLE UserLocations 
    (user_id INTEGER NOT NULL UNIQUE 
        REFERENCES Users (user_id), 
        dep_id INTEGER NOT NULL, 
        loc_id INTEGER NOT NULL, 
        FOREIGN KEY (loc_id, dep_id) 
        REFERENCES DepartmentLocations (loc_id, dep_id)); 
    
    +0

    꽤 좋은 것 같습니다. 사용자가 두 개 이상의 위치에 대한 departement에서 작업하는 경우 사용자는 UserLocations 테이블에서 여러 레코드를 가져 오기만하면됩니까? – kramer65

    +0

    @ kramer65 예. 예를 들어 키를 변경해야합니다. '(dep_id, user_id)' – onedaywhen