最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

程序員應(yīng)該知道的數(shù)據(jù)庫設(shè)計(jì)的兩個誤區(qū)

 更新時間:2010年07月10日 00:44:13   作者:  
在幾乎所有的企業(yè)級應(yīng)用程序中,包括各種MIS、ERP、CRM等等,都會使用數(shù)據(jù)庫,這樣的好處是顯而易見的,很容易地實(shí)現(xiàn)了數(shù)據(jù)層和業(yè)務(wù)邏輯層的分離,而且對于性能的優(yōu)化也在一定程度上提供了便利。

然而,在我所經(jīng)歷過的項(xiàng)目中,某些數(shù)據(jù)庫的設(shè)計(jì)會存在一些問題,尤其普遍的就是下面將要描述的這兩點(diǎn),個人覺得是應(yīng)該避免的誤區(qū),總結(jié)出來與大家討論。

誤區(qū)之一 備用字段

現(xiàn)象描述:

在數(shù)據(jù)表中,不僅設(shè)計(jì)了當(dāng)前所需要的字段,而且還在其中留出幾個字段作為備用。

比方說,我設(shè)計(jì)了一個人員表(Person),其中已經(jīng)添加了各種必要的字段,包括姓名(Name)、性別(Sex)、出生年月日(birthday)等等。大功告成之后,我忽然想到,將來系統(tǒng)中應(yīng)該還會有很多其它與人相關(guān)的內(nèi)容吧,比方說畢業(yè)院校,比方說工作單位等等,盡管現(xiàn)在根本不需要填寫,以后可能還是會用到的吧。拍腦袋一項(xiàng),那就加入5個varchar2型的字段,分別叫做Text1、Text2……Text5,然后又想,應(yīng)該還有一些日期型的字段需要備用,就又建立了三個date型的字段,分別起名叫做date1、date2、date3,……

原因分析:

大家應(yīng)該已經(jīng)看出問題了,在這個數(shù)據(jù)表中存在大量暫時無用的字段,我們可以稱之為備用字段,它們的作用是什么呢?就是以防萬一,防備可能的情況。

這似乎可以叫做防患于未然,等到時候需要的時候,就不需要在表中增加新的字段了,而且這樣做的話,一個表的數(shù)據(jù)應(yīng)該會被存儲在相鄰的物理空間中,這對于性能也是有好處的。

另外的原因就是,在古老的數(shù)據(jù)庫中,如果改變數(shù)據(jù)庫的定義(包括增加字段、改變字段的類型、刪除字段等等),那么其中所有的數(shù)據(jù)就會丟失,所以這項(xiàng)工作非常麻煩,我們需要先建立臨時表,將數(shù)據(jù)備份出來,然后創(chuàng)建新表,將數(shù)據(jù)導(dǎo)入其中,最后再刪除原來的表。

問題所在:

這樣的做法對于項(xiàng)目會導(dǎo)致很多問題,而且原先想要解決的問題并不一定能夠解決,不信的話,請往下看。

問題一:增加大量備用字段,必定會浪費(fèi)很多空間,盡管其中可能都沒有具體的數(shù)據(jù),但是僅僅是空字段也會占據(jù)一定的空間的。

問題二:由于命名的特點(diǎn),如果沒有完善的文檔管理流程,用不了多久(可能也就是兩三年),就沒有人能夠說清楚到底哪個字段代表的是什么意義了。就算有文檔管理,這些管理工作也會比較麻煩,而且在每次使用的時候都需要申請,還有可能會出現(xiàn)沖突的情況。

問題三:增加了這些備用字段就真的會夠用嗎?不一定,因?yàn)槲覀冎皇敲總€類型的字段留出幾個備用,如果數(shù)量超過,或者要使用特殊的、不常用的類型的時候,還是需要增加新的字段。比方說在上述的Person表中,我們要存儲照片,那么可能就要增加一個blob類型的photo字段,這在初期設(shè)計(jì)的時候可不一定會留出這樣的備用字段。而且如果沒有完善的管理,誰又能說清楚倒底哪個字段已經(jīng)被使用,哪個字段還可以使用呢?到時候還不是要增加新的字段。

解決方案:

其實(shí)上面的這種設(shè)計(jì)方式就是一種“過度設(shè)計(jì)”,我們應(yīng)該做的就是“按需設(shè)計(jì)”,在經(jīng)過詳細(xì)有效的分析之后,在數(shù)據(jù)表中只放置必要的字段,而不要留出大量的備用字段。

當(dāng)需要增加相關(guān)的信息的時候,就要具體情況具體分析:

如果數(shù)量很少,而且信息的性質(zhì)與原表密切相關(guān),那么就可以直接在原表上增加字段,并將相關(guān)的數(shù)據(jù)更新進(jìn)去。

如果數(shù)量較大,或者并非是原表對象至關(guān)重要的屬性,那么就可以新增一個表,然后通過鍵值連接起來。

對于表的數(shù)據(jù)的存儲位置所導(dǎo)致的性能問題,我們可以通過在特定時間對數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行重組來解決,而這項(xiàng)工作對于長期運(yùn)行的數(shù)據(jù)庫來說,也是需要定期進(jìn)行的。

誤區(qū)之二 有意義的編碼

現(xiàn)象描述:

使用有意義的編碼作為一條記錄的ID,甚至作為數(shù)據(jù)庫的主鍵存在,例如,一個員工的編碼設(shè)置為0203004,其中02代表員工所在分公司,03代表員工所在部門,004代表員工進(jìn)入到該部門的序號。

原因分析:

ID的設(shè)置方式大概有以下幾種,一種是純粹的流水號,從1開始,每次加1,或者對其將以改進(jìn),將數(shù)字轉(zhuǎn)換成為字符串的格式,比方說“0000001”;一種是無意義的隨機(jī)編碼,比方說GUID;還有一種就是有意義的編碼,特定的位數(shù)會代表一定的意義。

我想之所以大家這么喜歡使用這種方式,主要是因?yàn)橄胍獜木幋a中就能夠得到一些信息,甚至有些程序中還有專門的對編碼進(jìn)行解析的模塊。就像我們的身份證號碼一樣,看到身份證號就可以知道辦身份證時的所在地、生日、性別等信息。

問題所在:

其實(shí)有意義的編碼會導(dǎo)致很多問題,請看:

問題一:對編碼資源的浪費(fèi)。如果是純粹的流水號,那么從1到10000就可以代表一萬條記錄,但是,如果使用有意義的編碼,很可能1000條記錄就會讓五位的編碼不夠用。我就遇到過真正的情況,我們公司的投保單號碼的第一位就是有意義的,代表的時該投保單所屬的渠道,后面跟著很長的一串?dāng)?shù)字(9位)。理論上來說,這些編碼永遠(yuǎn)都不會用完,但是,最開始的三個渠道使用的是1、4、7三個編碼,但是一次新保險法的實(shí)行,導(dǎo)致原有的投保單作廢,于是又啟用了三個數(shù)字2、5、8,接下來公司改名,三個渠道又分別將投保單報廢,重新啟用新的開頭數(shù)字,就這樣,短短的幾年間,所有的投保單號碼全都被用完了,其實(shí)打印出來的投保單不過100萬張。

問題二:不一定是唯一的,難以作為主鍵。想一下,我們的身份證號碼就是這樣的。原先15位的時候,后三位是序號,而男性會使用奇數(shù),女性會使用偶數(shù),這樣就是說,一個地區(qū)同一天生日的人,男女都不能超過500人,否則就會導(dǎo)致號碼的重復(fù),盡管出現(xiàn)這種現(xiàn)象的概率比較低,但是還是客觀存在的。

問題三:代表的意義不一定準(zhǔn)確。比方說用帶有意義的編碼來為員工定義工號,其中可能會有部門、職務(wù)等等意義,但是如果員工在部門間發(fā)生了調(diào)動,或者職級發(fā)生了改變,是否需要改變他的編碼呢?改變吧,那么所有的歷史數(shù)據(jù)都要隨之修改一次,工作量會非常大;不改變吧,那么代表的意義就不再準(zhǔn)確,我們就無法從編碼中得到該員工準(zhǔn)確的信息。

解決方案:

所以,對于編碼,非常不建議使用有意義的編碼,要么使用純粹的流水號,但這樣可能需要定義一個范圍比較大的類型,對于海量記錄的數(shù)據(jù),可能會不夠用;那樣的話就可以使用GUID,這樣編碼永遠(yuǎn)都不會重復(fù),而且會有大量的編碼資源可用。

從上面的兩點(diǎn)我們可以看出,在數(shù)據(jù)庫設(shè)計(jì)的過程中,有一些在非常多系統(tǒng)中都使用了,但是卻帶來了很多問題的方法,對于這種情況,我們就應(yīng)該仔細(xì)思考,然后痛下決心,堅(jiān)決抵制。

相關(guān)文章

  • 用戶管理的備份(一致性備份、非一致性備份、脫機(jī)備份、聯(lián)機(jī)備份)

    用戶管理的備份(一致性備份、非一致性備份、脫機(jī)備份、聯(lián)機(jī)備份)

    用戶管理的備份(一致性備份、非一致性備份、脫機(jī)備份、聯(lián)機(jī)備份)說明文檔。
    2009-05-05
  • Django項(xiàng)目優(yōu)化數(shù)據(jù)庫操作總結(jié)

    Django項(xiàng)目優(yōu)化數(shù)據(jù)庫操作總結(jié)

    這篇文章主要介紹了Django項(xiàng)目中優(yōu)化數(shù)據(jù)庫操作總結(jié),有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家共進(jìn)步,早日升職加薪
    2021-09-09
  • 詳解通過SQL進(jìn)行分布式死鎖的檢測與消除

    詳解通過SQL進(jìn)行分布式死鎖的檢測與消除

    本文主要介紹在 GaussDB(DWS) 中,如何通過 SQL 語句,對分布式死鎖進(jìn)行檢測和恢復(fù)。
    2021-05-05
  • 如何利用分析函數(shù)改寫范圍判斷自關(guān)聯(lián)查詢詳解

    如何利用分析函數(shù)改寫范圍判斷自關(guān)聯(lián)查詢詳解

    這篇文章主要給大家介紹了關(guān)于如何利用分析函數(shù)改寫范圍判斷自關(guān)聯(lián)查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用sql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • SQL注入的2個小Trick及示例總結(jié)

    SQL注入的2個小Trick及示例總結(jié)

    這篇文章主要給大家介紹了關(guān)于SQL注入的2個小Trick的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 關(guān)于hive表的存儲格式ORC格式的使用詳解

    關(guān)于hive表的存儲格式ORC格式的使用詳解

    這篇文章主要介紹了關(guān)于hive表的存儲格式ORC格式的使用詳解,Hive?是基于?Hadoop?的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張表,并提供類SQL查詢功能,需要的朋友可以參考下
    2023-07-07
  • 關(guān)于hive中SQL的執(zhí)行原理解析

    關(guān)于hive中SQL的執(zhí)行原理解析

    這篇文章主要介紹了關(guān)于hive中SQL的執(zhí)行原理解析,Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張表,并提供類SQL查詢功能,需要的朋友可以參考下
    2023-07-07
  • 關(guān)于Hive中的NULL空值處理問題

    關(guān)于Hive中的NULL空值處理問題

    這篇文章主要介紹了關(guān)于Hive中的NULL空值處理問題,Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張表,并提供類SQL查詢功能,需要的朋友可以參考下
    2023-07-07
  • 淺談關(guān)系型數(shù)據(jù)庫中的約束及應(yīng)用場景

    淺談關(guān)系型數(shù)據(jù)庫中的約束及應(yīng)用場景

    這篇文章主要介紹了淺談關(guān)系型數(shù)據(jù)庫中的約束及應(yīng)用場景,關(guān)系型數(shù)據(jù)庫是一種廣泛應(yīng)用的數(shù)據(jù)庫類型,它的核心是基于關(guān)系模型的結(jié)構(gòu)化數(shù)據(jù)存儲和管理,在關(guān)系型數(shù)據(jù)庫中,約束是一種重要的概念,它可以幫助我們保證數(shù)據(jù)的完整性和一致性,需要的朋友可以參考下
    2023-07-07
  • 當(dāng)數(shù)據(jù)庫變慢時的解決方法

    當(dāng)數(shù)據(jù)庫變慢時的解決方法

    當(dāng)數(shù)據(jù)庫變慢時,我們應(yīng)如何入手,下面的解決方法。
    2009-04-04

最新評論

桃江县| 岳普湖县| 南华县| 宁化县| 阳江市| 永福县| 阿城市| 稷山县| 新兴县| 瑞安市| 牡丹江市| 图片| 郁南县| 广宗县| 崇左市| 佛教| 都江堰市| 金湖县| 桓台县| 临潭县| 吉林省| 海门市| 巴林右旗| 宣汉县| 吉林省| 丹棱县| 荃湾区| 杭锦后旗| 莲花县| 宜良县| 平塘县| 罗平县| 梓潼县| 青州市| 靖州| 巴林右旗| 乌兰浩特市| 南平市| 邢台市| 梁山县| 信阳市|