1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        數(shù)據(jù)庫設計原則

        共 2505字,需瀏覽 6分鐘

         ·

        2022-03-01 21:49

        點擊上方“程序員大白”,選擇“星標”公眾號

        重磅干貨,第一時間送達

        引言

        • 本文小結了數(shù)據(jù)設計原則;

        • 數(shù)據(jù)庫設計對于數(shù)據(jù)庫的可維護性、可擴展性至關重要,某些原則必須嚴格遵守;

        數(shù)據(jù)庫設計范式

        • 第一范式:屬性具有原子性,不可再分解,即不能表中有表;

        • 第二范式:唯一性約束,每條記錄有唯一標示,所有的非主鍵字段均需依賴于主鍵字段;

        • 第三范式:冗余性約束,非主鍵字段間不能相互依賴;

        數(shù)據(jù)庫設計原則

        • 完整性:

          • not null聲明禁止插入空值;

          • check子句限制屬性域;

        • 去冗余:

          • 避免冗余屬性,冗余屬性會帶來數(shù)據(jù)不一致性;

          • 學生選課系統(tǒng)中,老師可以開課、學生可以選課,數(shù)據(jù)庫設計中,課程可以由課程編號和課程名稱等確定;

          • 如果現(xiàn)在維護兩個表,一個表A存儲課程信息(課程編號、名稱、簡介、學分、院系等),另一個表B存儲開課信息(有哪些課程開課),如果B中重復存儲了A的課程名稱、簡介、學分、院系等信息,一旦A中的信息更新,B中和A中信息便出現(xiàn)不一致;

          • 正確的做法是,B中只存儲課程編號,并以此和A相關聯(lián);

        • 解耦合:

          • 一個表只存儲它應該存儲的信息,和此表無關的信息放到另一個表去存儲,表之間盡量解耦;

          • 上面的例子中,A中存儲且只存儲面向課程的信息,另外有表C,存儲且只存儲面向學生的信息(學號、姓名、性別、年齡、選課id等),對于“課程級別”的信息,應當堅決的存儲在A而不是C中,而且盡量避免將A、C合并成一個表(可能剛開始是設計成一個表),而且A、C間盡量解耦;

        • 字段不可再分:

          • 一個字段中不要出現(xiàn)分隔符,或者在一個字段中存儲多個信息;

          • 例如,first name和last name不要放在同一個字段中,穩(wěn)定版本號和臨時版本號不要放在同一個字段中;

        • 考慮性能:

          • 上述原則可能造成多表連接查詢的情況出現(xiàn),降低性能;

          • 如果性能成為主要矛盾,則上述原則也不絕對;

        數(shù)據(jù)庫命名原則

        • 數(shù)據(jù)庫的命名會直接影響到上層應用的名稱,所以要和業(yè)務部門仔細討論、慎重確定;

        • 每個屬性名在數(shù)據(jù)庫中只有唯一的含義,number這個屬性名可能表示電話號碼或是房間號,這是一種容易引起歧義的命名;

        • 數(shù)據(jù)庫的名詞要一致,不能在這個地方叫一個名字,到另外一個表又叫另外一個名字;

        • 一般來說,Table命名用單數(shù),Column命名用單數(shù);

        • Table不用Prefix前綴來表示不同的組,而用schema來劃分命名空間(postgresql中);

        • 命名用snake_case,不要有其他特殊字符;

        • 名稱中不要有sql關鍵字;

        • 如果確實需要使用sql關鍵字,可用雙引號包圍,比如CREATE TABLE "order"(...)

        • 主鍵的名字永遠都是同一的,就是id,外鍵名稱才需要加table的名字,諸如xxx_id、yyy_id;

        • 命名不要用縮寫,比如date縮寫成dt;

        • 用?create_date/update_date/sample_date這些含義更明確的名稱代替date這個命名,這樣不僅表達更準確,而且避免了用關鍵字的麻煩;

        • timestamp類型的字段要有timezone(時區(qū)),字段名用xxx_date的形式,僅表示年月日用xxx_day,僅表示時分秒用xxx_time;

        • 表示數(shù)量、次數(shù)等概念的字段名稱最好寫為xxx_count,不要寫為xxx_number/xxx_num/xxx_no等;

        • boolean類型的命名要用is_xxx格式;

        數(shù)據(jù)庫設計其他注意事項

        • 每個表都要有主鍵,名稱是id,類型為bigint

        • 主鍵的類型是設為integer還是long,取決于這個系統(tǒng)用多長時間,如果要用100年,主鍵還是設置為long類型較好,這樣用的很久以后id也不會超出范圍;

        • 一個字段不要有多個用途,空間不是問題,清晰才是重點;

        • 不要過早優(yōu)化,先把東西做出來再說,遇到性能問題再去優(yōu)化;

        • 對于varchar類型的字段,當字符串并不是非常明確到底限制是多少的時候,通常選擇255這個長度,varchar(50)并不比varchar(255)節(jié)省空間,varchar(50)僅僅是表示最多分配50個字符而已;

        • varchar(100)類型在PostgreSQL中代表100個字符,而在Oracle中代表100字節(jié),具體的占用空間數(shù)目和語言、編碼方式有關;

        • 對外鍵要加Index;

        • 數(shù)據(jù)庫里面的密碼一定要加密,不能保存明文;

        • is_deleted=true來表示本條記錄的業(yè)務上的刪除,不要在數(shù)據(jù)庫中真正刪除記錄,或者僅僅是版本化修改,這樣能防止數(shù)據(jù)丟失;

        數(shù)據(jù)庫性能提升方案

        • 使用索引會大大提升查詢效率,同時降低在被索引的表上INSERT和DELETE效率;

        • 分離頻繁和不頻繁使用的數(shù)據(jù)到多個表中;

          • 例如,原先,一個表中保存用戶名、密碼、年齡、個人簡介、學校等信息,但是發(fā)現(xiàn)訪問用戶名、密碼、年齡的頻率遠高于其他字段,此時就應當將這個表分為兩個表,分別存儲頻繁訪問項和非頻繁訪問項;

        數(shù)據(jù)庫安全策略

        • 至少保存3個月的系統(tǒng)訪問日志;

        • 數(shù)據(jù)庫中的表可以有創(chuàng)建和更新時間戳,及所創(chuàng)建/修改行的用戶標示;

        • 不刪除字段,而是打上一個被刪除的標記;

        • 版本化修改;

        大型數(shù)據(jù)庫設計

        • 負載均衡;

        • 讀寫分離;

        • 分布式存儲;

        • 參考這篇文章(https://www.cnblogs.com/ejiyuan/archive/2010/10/29/1796292.html);

        source: //changsiyuan.github.io/2016/05/06/2016-5-6-database-design/

        13個你一定要知道的PyTorch特性

        解讀:為什么要做特征歸一化/標準化?

        一文搞懂 PyTorch 內(nèi)部機制

        張一鳴:每個逆襲的年輕人,都具備的底層能力




        ,,西,質(zhì)[]!


        瀏覽 23
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产嫩逼视频 | 日韩欧美日韩欧美 | www.国产视频在线观看 | 免费一级A片在线观看视频 | 男男插插插 | 黄色视频电影 | www.younv | 成人性生交无码视频 | 欧美极品一区二区在线播放国产 | 亚洲www啪成人一区二区麻豆 |