主頁 > 資料庫 > 我設計資料庫常用的幾個原則

我設計資料庫常用的幾個原則

2020-11-02 13:51:25 資料庫

以MySQL5.7為例,在一個專案中的資料庫schema中建表

〇、建庫

統一字符集和排序規則

規則

庫的默認字符集選擇utf8mb4,表、欄位默認上級

庫的排序規則選擇utf8mb4_general_ci,表、欄位默認上級

好處

統一排序規則,防止不必要的隱式轉換,庫級先指定,表級,欄位級默認上級即可,

一、命名法

如果是大小寫敏感的資料庫【MySQL】就用蛇形命名法【小寫+下劃線】

如果是大小寫不敏感的資料庫【SQL Server】就用大駝峰式【大小寫】

二、望文生義,自說明

百度百科中,望文生義:漢語成語,意思是指不了解某一詞句的確切涵義或來源緣由,光從字面上去牽強附會,做出不確切的解釋,

規則

在資料庫設計中,表名欄位名一定要用有意義的名詞,即自說明,每一個名詞都是由有意義的英文或者通用英文縮寫組成,鑒別方式:使用百度搜索欄位名中的單詞,可以搜索到,則命名沒問題,

例子

公司可以使用 corporation 或者縮寫corp,不能用gongsi,下圖為搜索縮寫的結果

數量可以使用 quantity 或者縮寫qty,不能用shuliang、numb(糟糕的選擇,單詞意義是麻木的; 失去知覺的; 遲鈍的; 呆滯的)、num,下圖為縮寫搜索的結果

注意:縮寫必須是約定俗成的,是行業通用的,否則寧可欄位過長也不要縮寫,不規范的縮寫會導致表名易用性和可維護性變差,對開發人員和維護人員極其不友好,

好處

使不了解表結構的人,直接看表名、欄位名就可以知道表、欄位的意義,盡量不查備注,因為查看備注也需要花時間,對開發的編碼流暢性干擾很大,

注意:
1、欄位名要簡短、易于理解、無歧義,
2、雖然已經望文生義、自說明,但是不意味著可以省略備注,每個表和欄位還是有必要加上備注的,防止出現歧義,

三、欄位統一

規則

意義相同的欄位就算在不同表中也要保持欄位名相同、保持型別相同,
所以備注要言簡意賅,如果不同表出現相同欄位,只要全庫搜索備注就能找到相同意義的欄位,這樣就可以維持欄位統一

好處

1、依舊是望文生義,當已經習慣于一個欄位名,該欄位在其他表中出現對開發識別欄位意義有幫助

2、當兩個表的資料相互傳遞時,可以使用相同屬性名反射實作set、get方法,給開發提供便利

3、型別相同防止欄位比較時出現隱式型別轉換

四、模塊分組

如果系統設計中劃分了模塊,各模塊的表名中必須加了相同的模塊簡稱前綴

例子

字典表模塊中的

計量單位表dict_unit

公司表dict_corp

系統模塊中的

用戶表sys_user

角色表sys_role

好處

相同模塊的表在工具中查看時是排列在一起的,方便查找相關表,

五、主鍵名

主鍵id不能統一命名為id,有要加上表資訊,即用戶表user主鍵user_id

規則

不要使用統一id當主鍵名,要有修飾詞

例子

用戶屬于某公司,即用戶表中需要存盤公司表的主鍵作為外鍵【即使不建立外鍵】

用戶表使用user,公司表使用corp

如果在公司表中主鍵id使用id,但在user表中主鍵id也是id,必然user表的外鍵公司id 應該是corp_id,這樣會導致一個結果當user表和corp表聯結時,

聯結條件必須是user.corp_id = corp.id

如果聯結的表過多時表名使用別名a,b,u,c時極其容易寫錯,還不容易排查錯誤

而如果user表主鍵定義為user_id,corp表主鍵定義為corp_id,user表中的公司id外鍵也定義為corp_id,

這樣當表聯結時,聯結條件寫為user.corp_id=corp.corp_id,聯結條件一目了然,提高了SQL的可讀性,節省了閱讀SQL時表聯結鍵的確認時間,

好處

節省開發時間,就算一次節省半秒,上千次之后也會節省十分鐘,作為一個專案經理或dba,就算你做不到給開發減輕作業量,也不能拖后腿吧,

符合欄位統一原則,

六、盡量not null

規則

在設計欄位時盡量使用not null不可空,

數字型別默認0,字串型別默認''零長度的字串,

日期型別如果可以默認當前時間,

我知道作為開發人員嫌不可空麻煩,但是實際上可以在物體的getter方法中改寫

數字可以return userId ==null?0:userID;

字串可以return name ==null?"":name.trim();

日期可以return dt==null?new DateTime();

以上寫法可以保證你的物體在插入時肯定不空,雖然開發寫起來麻煩,但是好處多多,

好處

易于優化,雖然很多開發不以為然,但是你的專案真的需要高性能時你會后悔莫及,而很多專案開始時由于開發不考慮性能導致后期優化很費勁,為什么不提前把可以做好的做到最好,

節省空間,雖然可能只節省一個bit,但積少成多,好的性能都是一點一點積累出來的,

防止java出現空指標,好多空指標都是由于臟資料引起的,

NULL可能導致計算錯誤,例如concat(a,b),若a是NULL,結果為NULL,

如果時間欄位無法默認時間,完全可以設定為null,不要在心里就反對null或者反對not null,我們是設計資料庫,不要出現黨*爭,

七、注意varchar

當欄位可以確定長度不超過一定數值時,建議使用char定長字串型別,但如果整張表已經出現變長欄位,那么都使用變長欄位即可,

規則

如果可以都使用定長字串,如果做不到就都使用變長字串

好處

節省空間

易于優化

速度快,DBMS易于處理

八、范式

盡量符合三范式

規則

欄位不可分割、表有主鍵、資料沒有允余、表間關系明確

好處

范式目的是使結構更合理,消除存盤例外,使資料冗余盡量小,便于插入、洗掉和更新,

范式是給關系型資料庫創立的,對于增刪改查四種操作總體來說性能和易用性最佳,如果你們的表只需要插入和查詢,或者只需要插入和清空,CRUD四種操作不全需要時,完全可以違反范式,具體情況具體分析,沒有必要在心里就反對范式或者嚴格遵守范式,我們是設計資料庫,不是教條主義,不要出現黨*爭,

九、固定欄位

洗掉標志、創建時間、修改修改、創建人id、修改人id五個欄位為必須欄位,

規則

洗掉標志默認為未洗掉的值,

創建時間設定為當前時間,

修改時間設定為資料修改時更新,

創建人設定id默認為0

創建人設定id默認為0

好處

大部分情況,這些欄位都有必要,除非不需要保留已洗掉資料的不需要洗掉標識,而這種情況,基本在專案開始時分辨不出需要邏輯洗掉還是物理洗掉,

創建時間、修改時間、創建人、修改人沒必要解釋

十、狀態值

規則

狀態值,盡量不使用0,一般選擇10,20,30,40等,

好處

防止需求突然加中間狀態,原來定義的是0,1,2,3連續的狀態,突然需要在2,3之間加個新狀態,只能使用4,這樣會對開發理解造成障礙,而如果初始就使用10,20,30,40作為狀態,突然需要在20,30之間添加新的狀態,完全可以使用25,即好理解又符合邏輯,

0對于前端開發不友好,

最后、上線前統一字符集和排序規則

專案上線之前執行以下SQL,會查詢出指定庫下的所有欄位的排序規則和字符集,一定要統一后,再上線
其他老生常談的問題可以自己查找,比如建議使用自增列做主鍵等

select table_name,column_name,character_set_name,collation_name
from information_schema.columns where table_schema = '庫名' and data_type = 'varchar'

好處

防止字串比較時出現隱式轉換,

總結、好的設計會提高性能,提升便利

在保證性能的基礎上,方便開發、易于運維、易于交接,

以上原則不是鐵律,如果有的原則導致性能急劇下降,使用很不便利,完全可以無視原則,具體情況具體分析,世界上沒有放之四海皆準的規則,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/199386.html

標籤:其他

上一篇:csv檔案匯入Sybase資料庫

下一篇:csv檔案匯入Sybase資料庫

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more