2017-04-18 27 views
0

我正在使用寫入Access的外部程序。該程序從電子表格收集數據,並將提交表格中的所有數據寫入我的Access數據庫。但是,這個問題已經出現並引發了很多問題,並且放慢了我們的數據庫,因爲當它寫入我的數據庫時,數據沒有正常化。當外部程序將多條記錄寫入一條記錄時,我如何規範化數據?

的形式看起來是這樣的

Name: John Doe 
DOb: April 1 1950 
SIN: 123456789 
Marital Status: Married 
Phone: 123456789 
Email: [email protected] 

然後,它使用了一個問題,字段名和輸入的數據作爲數據表單上寫的一切作爲一個記錄。事情是這樣的:

Name | DOB   | SIN  | Marital_Status | Phone | Email 
John Doe| April 11 1950| 123456789| Married  | 123456789| [email protected] 

看,這就是沒有多少與示例形式的問題,但在這裏,我們有形式與我們結束了一個表像場約100問題:

Name|Date|Weather|Question1|Question2|Question3|Question4|...|Question100 

....等等。

作爲一個小白,我做了什麼至今用的是工會的SQL查詢來操縱數據,以便它讀取:

Name|Date|Weather|Question1 
Name|Date|Weather|Question2 
Name|Date|Weather|Question3 
Name|Date|Weather|QuestionN 

我已經能夠用這種度日,但它嚴重放緩下來我的數據庫,現在我有其他問題。

當外部程序寫入這樣的數據時,如何規範化這些數據?我無法操縱程序如何寫入我的Access數據庫。

回答

1

你正確地做到這一點,聯合查詢確實是規範化非規範化表的正確方法。但是,除了非規範化之外,還應考慮將其存儲爲規範化的,以便您實際上可以使用數據,而無需每次訪問數據時都訪問執行100次查詢。考慮將Name | Date | Weather分割爲不同的表格,因爲每個問題重複100次。

只需執行SELECT * INTO MyTable From UnionQuery即可將聯合查詢結果存儲在表中。在宏中將來自其他程序的導入與此查詢組合在一起。

顯然,這並不理想。理想的解決方案是操縱外部程序以不首先將數據非規範化

3

Access 2010具有一個名爲event-driven data macros的功能,它類似於其他數據庫系統中的觸發器。我個人沒有任何使用它們的經驗,但是看起來你應該能夠創建一個插入宏之後插入一個新行。在這個宏中,你可以分開你的問題並將它們插入一個更規範化的表格中(然後用它來報告)。

+0

可能是比我的更好的解決方案。請注意,由於它是外部應用程序,因此它與數據庫的接口必須支持事件驅動的數據宏(據我所知,ODBC確實是這樣) –

+0

這是真的嗎?爲什麼數據到達那裏如此重要? – Jerrad

+1

因爲接口必須觸發宏(通常沒有問題,除非程序使用它自己的數據庫引擎,如UCanAccess),並且必須能夠處理運行宏所需的所有操作(如果宏只使用數據庫引擎,但如果宏依賴於用戶定義的函數將會導致問題)。檢查這篇文章:https://www.pcreview.co.uk/threads/data-macros-dont-work-with-linked-tables。4046809 /舉例說明它會導致問題。 –