2014-01-30 27 views
0

我正在構建我正在開發的項目的下層數據庫結構的中間,並且我希望從DB精明的人員那裏得到關於此的一般性建議。具有時間第三維的數據庫結構

我將存儲在人的信息,即:

id | name | position | ... 
    ----+------+------------+---- 
    1 | Me | Programmer | ... 
    ----+------+------------+---- 
    ... | ... | ...  | ... 

我要關注的關鍵是如何存儲有關的位置和其他類似領域的信息,因爲我希望他們有時間元素使矩陣3維。我希望能夠提取數據,它可以告訴一個人佔據一個特殊的位置,即:

Me | 2009-2011 Programmer | 2011-2013 Project Coordinator 

爲了實現這一目標,這將是最合適的 - 有保存所有這些數據的一個領域,還是有許多領域每個都只有很少的數據?

1)要使用XML作爲我可以提取,處理和在放回,如字段的內容:

<person name="Me"> 
     <position from="2009" to="2011">Programmer</position> 
     <position from="2011" to="2013">Project Coordinator</position> 
    </person> 

2)爲了使另一個表類同這一個:

id | person_id | position | date_from | date_to 
    ----+-----------+------------+-----------+-------- 
    1 | 1   | Programmer | 2009  | 2011 
    ----+-----------+------------+-----------+-------- 
    2 | 1   | Proj. Cord.| 2011  | 2013 

編輯:

id | person_id | type (/type_id)  | content | date_from | date_to 
    ----+-----------+---------------------+----------+-----------+-------- 
    1 | 1   | Position (/1)  | Program. | 2009  | 2011 
    ----+-----------+---------------------+----------+-----------+-------- 
    2 | 1   | Position (/1)  | Proj.Cor.| 2011  | 2013 
    ----+-----------+---------------------+----------+-----------+-------- 
    3 | 1   | Organization (/2) | Webbureau| 2011  | 2013 

編輯結束

然後只提取屬於這個人的每個領域?

如何從一個領域提取大量數據與來自多個領域的小數據之間的權衡(理論上說,因爲我將創建的領域最多將爲xml的100-150行左右,先決條件)。還是有更好的方法來創建一個三維數據庫?

在此先感謝

回答

0

你的命題N#1會導致頭痛查詢數據。想象一下像「誰在這裏工作,以及在1976年7月4日的哪個位置」?

你的建議n#2就是我所說的「年表」。這是非常有效的,你可以用它來進行各種「按時間順序」的事件,例如:

  • 程序ISO什麼,版本1.034,從02.02.1998到01.01.2003有效。
  • 此人的護照於2009年11月1日簽發,有效期至2019年10月30日。
  • 這間客房是留給在3月15日開會,10日至12

在所有這些情況(及其他),你可以使用「年表」的策略。這也意味着,在開發方面,您可以輕鬆定義一些「年代」對象,方法和屬性來操縱這類數據。

當您決定將相似的實體放在同一個表中時,您的編輯就是我們可以稱之爲泛化的建議。爲什麼不?只是要小心,不要總結'那麼多'。例如,您可以堅持一個'personActivity'年表,您可以記錄與人員相關的所有專業活動,從工作崗位到培訓。然後,我會贊成額外的Tbl_Activity表格,列出可以鏈接到一個人的所有活動。

說到性能,您可以通過正確索引表列來做很多事情。請求這些字段時,外鍵(人員,活動)上的索引會使事情變得非常快。您的問題可能會與查詢日期相關聯。您可以考慮添加一些'非規格化'布爾字段,例如'activityIsCurrent':'當前'概念事實上與date_to字段的值不存在有關,因此我們事實上在數據中存在一些冗餘。但有一個布爾值持有這種信息使得編寫和執行查詢很多簡單...

我們在這裏有超過100 000條按時間順序排列的關於我們員工數據的記錄,並且遵循這些建議確實可以。

+0

我明白了!然後,您會將該字段的「類型」(即位置,培訓,組織 - 請參閱已編輯的問題2)與另一個包含定義的數據庫表關聯起來,還是隻將這些類型直接寫入表中?在表格成爲問題之前,表格能夠保存多少記錄? –

+0

看到我的編輯... –

+0

謝謝Philippe! –

1

Normal Forms將答案:

什麼是最合適的 - 有保存所有這 數據,或有持有每個小數據很多領域一個領域?

甲關係在first normal form如果每個屬性域僅包含原子值
1NF的子規則之一是確保沒有重複的數據組

enter image description here
當前人們的位置將被存儲在People表。
當前位置正在改變時,先從舊的位置(如果有的話)形成PositionHistory,並將結束日期更新爲sysDate,然後將新記錄插入PositionHistory,新位置和sysDate的開始日期以及結束日期值爲null。

+0

感謝您的闡述,Mohsen! –