如何設(shè)計數(shù)據(jù)庫結(jié)構(gòu)

字號:

新手來看:如何設(shè)計數(shù)據(jù)庫結(jié)構(gòu)
    有一定啟發(fā)的,前面幾段就不用看了,重點在后面。
    本文為開發(fā)人員提供了一些技巧,使用這些技巧可以在設(shè)計 Access 表時避免某些問題。本文適用于 Microsoft Access 數(shù)據(jù)庫 (.mdb) 和 Microsoft access 項目 (.adp)。
    簡介
    在設(shè)計數(shù)據(jù)庫時,最重要的步驟是要確保數(shù)據(jù)正確分布到數(shù)據(jù)庫的表中。使用正確的數(shù)據(jù)結(jié)構(gòu),可以極大地簡化應(yīng)用程序的其他內(nèi)容(查詢、窗體、報表、代碼等)。正確進行表設(shè)計的正式名稱是“數(shù)據(jù)庫規(guī)范化”。
    本文簡要介紹數(shù)據(jù)庫規(guī)范化的基本概念和一些需要注意并力求避免的常見問題。
    理解您的數(shù)據(jù)
    在設(shè)計表之前,應(yīng)明確您打算如何處理數(shù)據(jù),還要了解隨著時間的推移數(shù)據(jù)會發(fā)生什么樣的變化。您所做的假設(shè)將會影響最終的設(shè)計。
    您需要什么樣的數(shù)據(jù)?
    設(shè)計應(yīng)用程序時,關(guān)鍵要了解設(shè)計的最終結(jié)果,以便確保您準備好所有必需的數(shù)據(jù)并知道其來源。例如,報表的外觀、每個數(shù)據(jù)的來源以及所需的所有數(shù)據(jù)是否都存在。對項目損失的莫過于在項目后期發(fā)現(xiàn)重要報表缺少數(shù)據(jù)。
    知道需要什么樣的數(shù)據(jù)后,就必須確定數(shù)據(jù)的來源。數(shù)據(jù)是否從其他數(shù)據(jù)源中導入?數(shù)據(jù)是否需要清理或驗證?用戶是否需要輸入數(shù)據(jù)?
    明確所需數(shù)據(jù)的類型和來源是數(shù)據(jù)庫設(shè)計的第一步。
    您打算如何處理這些數(shù)據(jù)?
    用戶是否需要編輯這些數(shù)據(jù)?如果需要,應(yīng)如何顯示數(shù)據(jù)以便于用戶理解和編輯?有沒有驗證規(guī)則和相關(guān)的查找表?要求對編輯和刪除保留備份的數(shù)據(jù)輸入有沒有相關(guān)聯(lián)的審核問題?需要為用戶顯示哪些摘要信息?是否需要生成導出文件?了解這些信息后,就可以想象字段之間是如何相互關(guān)聯(lián)的了。
    數(shù)據(jù)之間如何相互關(guān)聯(lián)?
    將數(shù)據(jù)分組放入相關(guān)字段(例如與客戶相關(guān)的信息、與發(fā)票相關(guān)的信息等),每個字段組都代表要建立的表。然后考慮如何將這些表相互關(guān)聯(lián)。例如,哪些表具有一對多關(guān)系(例如,一個客戶可能持有多張發(fā)票)?哪些表具有一對一關(guān)系(這種情況下,通常會考慮將其組合到一個表中)?
    隨著時間的推移數(shù)據(jù)會發(fā)生什么樣的變化?
    設(shè)計表之后,常常會由于沒有考慮時間的影響而導致以后出現(xiàn)嚴重問題。許多表設(shè)計在當時使用時效果非常好,但是,常常會因為用戶修改數(shù)據(jù)、添加數(shù)據(jù)以及隨時間的推移而崩潰。開發(fā)人員經(jīng)常會發(fā)現(xiàn)需要重新設(shè)計表的結(jié)構(gòu)來適應(yīng)這些變化。表的結(jié)構(gòu)發(fā)生變化時,所有相關(guān)的內(nèi)容(查詢、窗體、報表、代碼等)也必須隨之更新。理解并預測數(shù)據(jù)會隨時間推移發(fā)生哪些變化,可以實現(xiàn)更好的設(shè)計,減少問題的發(fā)生。
    學習如何使用查詢
    了解如何分析和管理數(shù)據(jù)同樣很重要。您應(yīng)該深刻理解查詢的工作原理,理解如何使用查詢在多個表之間鏈接數(shù)據(jù),如何使用查詢對數(shù)據(jù)進行分組和匯總,以及如何在不需要以規(guī)范化格式顯示數(shù)據(jù)時使用交叉表查詢。
    好的數(shù)據(jù)設(shè)計的最終目標就是要平衡兩個需要:既要隨著時間的推移有效地存儲數(shù)據(jù),又要輕松地檢索和分析數(shù)據(jù)。理解查詢的功能對正確設(shè)計表很有幫助。
    數(shù)據(jù)庫規(guī)范化概念
    這部分介紹數(shù)據(jù)庫規(guī)范化所涉及的基本概念,而不是對數(shù)據(jù)庫規(guī)范化進行理論性的探討。如何在您的實際情況中應(yīng)用這些概念可能會隨著應(yīng)用程序需要的不同而有所變化。這部分的目的是理解這些基本概念、根據(jù)實際需要應(yīng)用它們,并理解偏離這些概念將會出現(xiàn)哪些問題。
    將信息存儲在一個地方
    大部分數(shù)據(jù)庫開發(fā)人員都理解數(shù)據(jù)庫規(guī)范化的基本概念。理想情況下,您希望將相同的數(shù)據(jù)存儲在同一個地方,并在需要引用時使用 ID 來進行引用。因此,如果某些信息發(fā)生了變化,則可以在一個地方進行更改,而整個程序中的相應(yīng)信息也會隨之更改。
    例如,客戶表會存儲每個客戶的記錄,包括姓名、地址、電話號碼、電子郵件地址以及其他特征信息??蛻舯碇锌赡馨?CustomerID 字段(通常是 Autonumber 字段),這個字段即該表的主鍵字段,其他表使用它來引用該客戶。因此,發(fā)票表可以只引用客戶的 ID 值,而不是在每張發(fā)票中存儲客戶的所有信息(因為同一個客戶可能會持有多張發(fā)票),這樣利用客戶的 ID 值即可從客戶表中查找客戶的詳細信息。使用 access 中功能強大的窗體(使用組合框和子窗體),可以輕松地完成這項工作。如果需要修改客戶信息(例如新增電話號碼),只需在客戶表中修改,應(yīng)用程序中引用該信息的任何其他部分都會隨之自動更新。
    使用正確規(guī)范化的數(shù)據(jù)庫,通過簡單的編輯即可輕松處理數(shù)據(jù)隨時間推移而發(fā)生的更改。使用未正確規(guī)范化的數(shù)據(jù)庫,通常需要利用編程或查詢來更改多條記錄或多個表。這不僅會增加工作量,還會增加由于未正確執(zhí)行代碼或查詢而導致數(shù)據(jù)不一致的可能性。