摘要:本文主要探討的是如何優(yōu)雅的設(shè)計(jì)表結(jié)構(gòu),讓人能夠直觀的從命名中窺探設(shè)計(jì)意圖,傳達(dá)設(shè)計(jì)者的設(shè)計(jì)目的,讓團(tuán)隊(duì)成員達(dá)成共識(shí),減少溝通成本。本文將從數(shù)據(jù)庫(kù)表的命名和字段的命名兩個(gè)方面展開(kāi)。
本文首發(fā)于知乎專(zhuān)欄,轉(zhuǎn)載請(qǐng)注明出處 https://zhuanlan.zhihu.com/p/20785905
數(shù)據(jù)庫(kù)表結(jié)構(gòu)設(shè)計(jì)作為后端軟件開(kāi)發(fā)不可或缺的一環(huán),是每個(gè)后端工程師都會(huì)經(jīng)歷的過(guò)程。筆者也多次經(jīng)歷過(guò)這樣的過(guò)程,也嘗試過(guò)多種不同的設(shè)計(jì)方案,也從一些優(yōu)秀的框架中學(xué)到不少,但并沒(méi)有發(fā)現(xiàn)相關(guān)的文章對(duì)其進(jìn)行總結(jié)。所以本文嘗試把筆者看到的、學(xué)到的總結(jié)下來(lái),希望對(duì)閱讀本文的讀者有所啟發(fā)。
表結(jié)構(gòu)設(shè)計(jì)主要有兩個(gè)目的,一是讓表結(jié)構(gòu)更加的更具有表現(xiàn)力,做到數(shù)據(jù)庫(kù)表的自描述,減少注釋甚至不使用注釋?zhuān)欢菨M(mǎn)足系統(tǒng)效率和擴(kuò)展性的需要,讓系統(tǒng)性能更好,后期維護(hù)更簡(jiǎn)單。
本文主要探討的是如何優(yōu)雅的設(shè)計(jì)表結(jié)構(gòu),讓人能夠直觀的從命名中窺探設(shè)計(jì)意圖,傳達(dá)設(shè)計(jì)者的設(shè)計(jì)目的,讓團(tuán)隊(duì)成員達(dá)成共識(shí),減少溝通成本。本文不討論表結(jié)構(gòu)設(shè)計(jì)對(duì)性能的影響,也不討論數(shù)據(jù)庫(kù)設(shè)計(jì)中的范式與反范式設(shè)計(jì)。本文將從數(shù)據(jù)庫(kù)表的命名和字段的命名兩個(gè)方面展開(kāi)。
數(shù)據(jù)庫(kù)表的命名使用名詞作為表名
仔細(xì)想想便可發(fā)現(xiàn),數(shù)據(jù)庫(kù)表中存在的所有數(shù)據(jù)都是現(xiàn)實(shí)世界各種操作的結(jié)果,它們有的是中間過(guò)程結(jié)果,有的是最終數(shù)據(jù)結(jié)果。不論怎樣,它們是一份一份沒(méi)有任何動(dòng)作的,靜態(tài)的記錄。而表本身就是存儲(chǔ)這些記錄的容器,從這樣的層面理解,表名應(yīng)該采用名詞的形式是完全符合邏輯的。
比如我們要設(shè)計(jì)一個(gè)存儲(chǔ)用戶(hù)邀請(qǐng)的表,invitation 就比 invite 更加的優(yōu)雅。
相關(guān)表采用統(tǒng)一前綴
我們知道,大型系統(tǒng)的設(shè)計(jì)往往按模塊或者子系統(tǒng)進(jìn)行劃分,一個(gè)一個(gè)模塊的處理問(wèn)題,保證模塊間的低耦合,模塊內(nèi)的高內(nèi)聚。數(shù)據(jù)庫(kù)表設(shè)計(jì)也一樣,我們可以對(duì)相關(guān)聯(lián)的表采用相同的前綴,使開(kāi)發(fā)人員一眼看上去就知道哪幾個(gè)表是相關(guān)的。
比如對(duì)于用戶(hù)基本信息表、用戶(hù)的詳細(xì)信息表和用戶(hù)的微信綁定表如下的命名更可?。?/p>
字段的命名user
user_profile
user_wechat
本節(jié)先介紹幾個(gè)比較通用的原則,使得字段的含義更容易理解,描述性更強(qiáng),之后進(jìn)行簡(jiǎn)單的總結(jié)分類(lèi),以便讓我們明白這些原則背后的邏輯。
使用動(dòng)詞被動(dòng)形式+描述性后綴
通過(guò)前面我們知道,數(shù)據(jù)庫(kù)表中的所有記錄都是靜態(tài)的結(jié)果性數(shù)據(jù),它是由一定的用戶(hù)操作產(chǎn)生的。那么它是如何產(chǎn)生的?經(jīng)過(guò)什么樣的操作產(chǎn)生的呢?
在解答之前先看一個(gè)例子,下面是一個(gè)簡(jiǎn)單的 article 表結(jié)構(gòu):
id: integer
title: varchar
content: text
user_id: integer
create_time: timestamp
這樣的設(shè)計(jì)本身是沒(méi)有問(wèn)題的,目前用的也很多。這個(gè)設(shè)計(jì)主要的問(wèn)題是沒(méi)有體現(xiàn)出 user_id 與這篇文章的關(guān)系,需要經(jīng)過(guò)一定的猜測(cè)和思考才能得出。create_time 雖然還比較直觀,但沒(méi)有體現(xiàn)出這篇文章實(shí)在過(guò)去的某個(gè)時(shí)間創(chuàng)建的。
然后我們?cè)趤?lái)看修改后的設(shè)計(jì):
id: integer
title: varchar
content: text
created_by: integer
created_at: timestamp
通過(guò)把 user_id 替換為 created_by、create_time 替換為 created_at,使得我們更容易理解對(duì)應(yīng)的文章是被指定的人在指定的時(shí)間創(chuàng)建出來(lái)的,而不需要我們的多方猜測(cè)或者查閱文檔,使得整個(gè)表結(jié)構(gòu)的描述性更強(qiáng)。
時(shí)間區(qū)分當(dāng)前時(shí)間和未來(lái)時(shí)間
英語(yǔ)中表時(shí)間的時(shí)候, at 一般跟一個(gè)時(shí)間點(diǎn),而 in 有表示在未來(lái)的某個(gè)時(shí)間之內(nèi)的意思。結(jié)合起來(lái),筆者傾向于用 at 表示過(guò)去或者現(xiàn)在的時(shí)間,而用 in 表示未來(lái)的時(shí)間。比如日歷中的 event 有開(kāi)始時(shí)間和結(jié)束時(shí)間的概念,我覺(jué)得如下的命名是比較合理的:
starts_at 事件的開(kāi)始時(shí)間,相對(duì) ends_in 它屬于當(dāng)前時(shí)間,采用 _at 后綴
ends_in 事件的結(jié)束時(shí)間,相對(duì) ends_in 它屬于未來(lái)時(shí)間,從用 _in 后綴
其他我們比較常用的比如 created_at、updated_at、expires_in 都屬于這種類(lèi)型。
使用第三人稱(chēng)單數(shù)
當(dāng)我們采用動(dòng)詞+介詞的時(shí)候我更傾向與使用第三人稱(chēng)單數(shù),因?yàn)樽侄蚊枋龅倪@個(gè)實(shí)體是單數(shù)的,通過(guò)使用第三人稱(chēng)單數(shù),我們可以自然語(yǔ)言的方式表達(dá)出需要的意思。比如以 event 為例,翻譯成英語(yǔ)是這樣的:
The event starts at 2016-05-05 12:00:00
完全符合英語(yǔ)的語(yǔ)法,也表達(dá)了我們想要表達(dá)的意思。
區(qū)分單數(shù)與復(fù)數(shù)
單數(shù)與復(fù)數(shù)主要是對(duì)字段內(nèi)容的描述,比如通知(notification)有接收人這個(gè)字段,如果我們需要通知能夠發(fā)送給多個(gè)人,那么 receivers 這樣的字段名稱(chēng)明顯好于 receiver,因?yàn)?receivers 體現(xiàn)了通知可以發(fā)送給多個(gè)人這一個(gè)事實(shí)。
前面從四個(gè)原則出發(fā)介紹了如何讓字段更具有描述性,簡(jiǎn)單總結(jié)下來(lái)我覺(jué)得從語(yǔ)義上來(lái)說(shuō),字段可以分為兩種類(lèi)型:描述性字段和動(dòng)作性字段。
描述性字段是對(duì)對(duì)應(yīng)數(shù)據(jù)庫(kù)記錄(或者說(shuō)實(shí)體)的補(bǔ)充說(shuō)明,比如以人作為實(shí)體,那么人的身高、體重和血壓就屬于這類(lèi)描述性字段。
描述性字段如果是動(dòng)詞+介詞的形式,動(dòng)詞需要采用第三人稱(chēng)單數(shù)的形式,比如 starts_at。然后根據(jù)字段的內(nèi)容,如果內(nèi)容有多個(gè)元素或?qū)嶓w,我們需要使用復(fù)數(shù),否則使用單數(shù)形式。
動(dòng)作性字段不僅能對(duì)所屬實(shí)體進(jìn)行補(bǔ)充說(shuō)明,還能對(duì)這個(gè)實(shí)體的所涉及操作有所描述。比如我們有 article 這個(gè)實(shí)體, article 的 created_by 和 created_at 就屬于動(dòng)作性字段,因?yàn)樗粌H表達(dá)了 article 的創(chuàng)建者和創(chuàng)建時(shí)間這層信息,它還表達(dá)了這個(gè) article 是指定的人被創(chuàng)建的,而不是憑空生成的。
2016年5月5日
北京
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21544.html
摘要:本文主要探討的是如何優(yōu)雅的設(shè)計(jì)表結(jié)構(gòu),讓人能夠直觀的從命名中窺探設(shè)計(jì)意圖,傳達(dá)設(shè)計(jì)者的設(shè)計(jì)目的,讓團(tuán)隊(duì)成員達(dá)成共識(shí),減少溝通成本。本文將從數(shù)據(jù)庫(kù)表的命名和字段的命名兩個(gè)方面展開(kāi)。 本文首發(fā)于知乎專(zhuān)欄,轉(zhuǎn)載請(qǐng)注明出處 https://zhuanlan.zhihu.com/p/20785905 數(shù)據(jù)庫(kù)表結(jié)構(gòu)設(shè)計(jì)作為后端軟件開(kāi)發(fā)不可或缺的一環(huán),是每個(gè)后端工程師都會(huì)經(jīng)歷的過(guò)程。筆者也多次經(jīng)歷過(guò)...
摘要:權(quán)限設(shè)計(jì)的雜談這篇文章的定位,不是宣傳某個(gè)框架,僅僅之是梳理一下有關(guān)權(quán)限方面的一些想法和最近項(xiàng)目中的一些探索過(guò)程。而這兩者的取舍則是有設(shè)計(jì)人員決定的。數(shù)據(jù)抽象原則最小特權(quán)劃分從某個(gè)程度上來(lái)說(shuō)決定了控制的對(duì)象,而數(shù)據(jù)抽象原則是是決定了操作。 權(quán)限設(shè)計(jì)的雜談 這篇文章的定位,不是宣傳某個(gè)框架,僅僅之是梳理一下有關(guān)權(quán)限方面的一些想法和最近項(xiàng)目中的一些探索過(guò)程。我們主要想解決一下問(wèn)題。 什么...
摘要:而漸進(jìn)增強(qiáng)和優(yōu)雅降級(jí)兩種不同的開(kāi)發(fā)流程,也是在我們項(xiàng)目初期做調(diào)研選型時(shí)會(huì)考慮的一個(gè)點(diǎn)。二者區(qū)別漸進(jìn)增強(qiáng)和優(yōu)雅降級(jí)只是看待同種事物的兩種觀點(diǎn)。漸進(jìn)增強(qiáng)和優(yōu)雅降級(jí)都關(guān)注于同一網(wǎng)站在不同設(shè)備里不同瀏覽器下的表現(xiàn)程度。 作為一名前端開(kāi)發(fā)人員,最頭疼的莫過(guò)于瀏覽器兼容。遠(yuǎn)古時(shí)期萬(wàn)惡的IE6,到現(xiàn)在CSS3不兼容的IE7/8.為了保證不同版本瀏覽器都有共同或更優(yōu)化的用戶(hù)體驗(yàn),前端搬磚的我們不得不與...
閱讀 1150·2021-11-25 09:43
閱讀 1583·2021-10-25 09:47
閱讀 2478·2019-08-30 13:46
閱讀 763·2019-08-29 13:45
閱讀 1292·2019-08-26 13:29
閱讀 3000·2019-08-23 15:30
閱讀 1113·2019-08-23 14:17
閱讀 1335·2019-08-23 13:43