2016-12-01 61 views
0

我建立的,我們應該有一個包含組織,地方,部門和用戶數據庫的系統。它們連接你所期望的:組織/位置/部門/用戶的最佳DB結構?

  • 每個組織可以包含一個或多個位置
  • 每個位置(建築)可包含在各部門工作的一個或多個部門
  • 一個或多個用戶
  • 一個用戶可以在多個部門工作

但是:部門可以跨越多個位置。

直觀上我會創建DB如下: circle 上面看到的結構的問題是BUT;不可能有一個跨越兩個地點的部門。我認爲這不是一個真正的問題,因爲我可以簡單地爲兩個位置創建相同的部門。如果有這個部門的管理員,我可以簡單地讓他在這兩個地點的管理員。

一個程序員提出了不同的結構,但:

tree 他是這個結構的大風扇,因爲他說,這是方式更加靈活,跨越東西翻過什麼。我的問題是手動讀取數據庫時可讀性差,另外在編寫代碼時我會更加困惑。

我的問題是;你更喜歡哪種結構?這最後一個結構的優點是什麼?這是更經常使用嗎?歡迎所有提示!

+0

那麼,我讀的是你有一個結構,它的工作原理,但可能會有點難以閱讀,和一個不工作,你問哪一個我們更喜歡...查看與工作 – SaggingRufus

+0

@SaggingRufus的一個 - 好了,第一個是在我看來,這樣更具可讀性,它有一個缺點在我看來是不是真的在實踐中的問題,而另外一個可能迎合爲所有可能性,但使事情變得非常複雜。我的問題是;是第二個數據庫設計使用了很多,還是這種程序員的一種模糊的想法? – kramer65

+0

@ kramer65我從來沒有見過第二個設計。也許這是因爲(如果黃色鍵是主鍵那麼它甚至不是以正常形式)(外鍵太多f.ex.)。 – 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

看起來很不錯。如果用戶在一個以上的位置工作,用戶只需在UserLocations表中獲取多個記錄? – kramer65

+0

@ kramer65是的,但您需要更改密鑰以適應此情況。 '(dep_id,user_id)' – onedaywhen