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

字號(hào):

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