成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

數(shù)據(jù)庫雜談之:如何優(yōu)雅的進行表結(jié)構(gòu)設(shè)計

DDreach / 637人閱讀

摘要:本文主要探討的是如何優(yōu)雅的設(shè)計表結(jié)構(gòu),讓人能夠直觀的從命名中窺探設(shè)計意圖,傳達(dá)設(shè)計者的設(shè)計目的,讓團隊成員達(dá)成共識,減少溝通成本。本文將從數(shù)據(jù)庫表的命名和字段的命名兩個方面展開。

本文首發(fā)于知乎專欄,轉(zhuǎn)載請注明出處 https://zhuanlan.zhihu.com/p/20785905

數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計作為后端軟件開發(fā)不可或缺的一環(huán),是每個后端工程師都會經(jīng)歷的過程。筆者也多次經(jīng)歷過這樣的過程,也嘗試過多種不同的設(shè)計方案,也從一些優(yōu)秀的框架中學(xué)到不少,但并沒有發(fā)現(xiàn)相關(guān)的文章對其進行總結(jié)。所以本文嘗試把筆者看到的、學(xué)到的總結(jié)下來,希望對閱讀本文的讀者有所啟發(fā)。

表結(jié)構(gòu)設(shè)計主要有兩個目的,一是讓表結(jié)構(gòu)更加的更具有表現(xiàn)力,做到數(shù)據(jù)庫表的自描述,減少注釋甚至不使用注釋;二是滿足系統(tǒng)效率和擴展性的需要,讓系統(tǒng)性能更好,后期維護更簡單。

本文主要探討的是如何優(yōu)雅的設(shè)計表結(jié)構(gòu),讓人能夠直觀的從命名中窺探設(shè)計意圖,傳達(dá)設(shè)計者的設(shè)計目的,讓團隊成員達(dá)成共識,減少溝通成本。本文不討論表結(jié)構(gòu)設(shè)計對性能的影響,也不討論數(shù)據(jù)庫設(shè)計中的范式與反范式設(shè)計。本文將從數(shù)據(jù)庫表的命名和字段的命名兩個方面展開。

數(shù)據(jù)庫表的命名

使用名詞作為表名

仔細(xì)想想便可發(fā)現(xiàn),數(shù)據(jù)庫表中存在的所有數(shù)據(jù)都是現(xiàn)實世界各種操作的結(jié)果,它們有的是中間過程結(jié)果,有的是最終數(shù)據(jù)結(jié)果。不論怎樣,它們是一份一份沒有任何動作的,靜態(tài)的記錄。而表本身就是存儲這些記錄的容器,從這樣的層面理解,表名應(yīng)該采用名詞的形式是完全符合邏輯的。

比如我們要設(shè)計一個存儲用戶邀請的表,invitation 就比 invite 更加的優(yōu)雅。

相關(guān)表采用統(tǒng)一前綴

我們知道,大型系統(tǒng)的設(shè)計往往按模塊或者子系統(tǒng)進行劃分,一個一個模塊的處理問題,保證模塊間的低耦合,模塊內(nèi)的高內(nèi)聚。數(shù)據(jù)庫表設(shè)計也一樣,我們可以對相關(guān)聯(lián)的表采用相同的前綴,使開發(fā)人員一眼看上去就知道哪幾個表是相關(guān)的。

比如對于用戶基本信息表、用戶的詳細(xì)信息表和用戶的微信綁定表如下的命名更可?。?/p>

user
user_profile
user_wechat

字段的命名

本節(jié)先介紹幾個比較通用的原則,使得字段的含義更容易理解,描述性更強,之后進行簡單的總結(jié)分類,以便讓我們明白這些原則背后的邏輯。

使用動詞被動形式+描述性后綴

通過前面我們知道,數(shù)據(jù)庫表中的所有記錄都是靜態(tài)的結(jié)果性數(shù)據(jù),它是由一定的用戶操作產(chǎn)生的。那么它是如何產(chǎn)生的?經(jīng)過什么樣的操作產(chǎn)生的呢?
在解答之前先看一個例子,下面是一個簡單的 article 表結(jié)構(gòu):

id: integer
title: varchar
content: text
user_id: integer
create_time: timestamp

這樣的設(shè)計本身是沒有問題的,目前用的也很多。這個設(shè)計主要的問題是沒有體現(xiàn)出 user_id 與這篇文章的關(guān)系,需要經(jīng)過一定的猜測和思考才能得出。create_time 雖然還比較直觀,但沒有體現(xiàn)出這篇文章實在過去的某個時間創(chuàng)建的。

然后我們在來看修改后的設(shè)計:

id: integer
title: varchar
content: text
created_by: integer
created_at: timestamp

通過把 user_id 替換為 created_by、create_time 替換為 created_at,使得我們更容易理解對應(yīng)的文章是被指定的人在指定的時間創(chuàng)建出來的,而不需要我們的多方猜測或者查閱文檔,使得整個表結(jié)構(gòu)的描述性更強。

時間區(qū)分當(dāng)前時間和未來時間

英語中表時間的時候, at 一般跟一個時間點,而 in 有表示在未來的某個時間之內(nèi)的意思。結(jié)合起來,筆者傾向于用 at 表示過去或者現(xiàn)在的時間,而用 in 表示未來的時間。比如日歷中的 event 有開始時間和結(jié)束時間的概念,我覺得如下的命名是比較合理的:

starts_at 事件的開始時間,相對 ends_in 它屬于當(dāng)前時間,采用 _at 后綴
ends_in 事件的結(jié)束時間,相對 ends_in 它屬于未來時間,從用 _in 后綴

其他我們比較常用的比如 created_at、updated_at、expires_in 都屬于這種類型。

使用第三人稱單數(shù)

當(dāng)我們采用動詞+介詞的時候我更傾向與使用第三人稱單數(shù),因為字段描述的這個實體是單數(shù)的,通過使用第三人稱單數(shù),我們可以自然語言的方式表達(dá)出需要的意思。比如以 event 為例,翻譯成英語是這樣的:

The event starts at 2016-05-05 12:00:00

完全符合英語的語法,也表達(dá)了我們想要表達(dá)的意思。

區(qū)分單數(shù)與復(fù)數(shù)

單數(shù)與復(fù)數(shù)主要是對字段內(nèi)容的描述,比如通知(notification)有接收人這個字段,如果我們需要通知能夠發(fā)送給多個人,那么 receivers 這樣的字段名稱明顯好于 receiver,因為 receivers 體現(xiàn)了通知可以發(fā)送給多個人這一個事實。

前面從四個原則出發(fā)介紹了如何讓字段更具有描述性,簡單總結(jié)下來我覺得從語義上來說,字段可以分為兩種類型:描述性字段動作性字段。

描述性字段是對對應(yīng)數(shù)據(jù)庫記錄(或者說實體)的補充說明,比如以人作為實體,那么人的身高、體重和血壓就屬于這類描述性字段。

描述性字段如果是動詞+介詞的形式,動詞需要采用第三人稱單數(shù)的形式,比如 starts_at。然后根據(jù)字段的內(nèi)容,如果內(nèi)容有多個元素或?qū)嶓w,我們需要使用復(fù)數(shù),否則使用單數(shù)形式。

動作性字段不僅能對所屬實體進行補充說明,還能對這個實體的所涉及操作有所描述。比如我們有 article 這個實體, article 的 created_by 和 created_at 就屬于動作性字段,因為它不僅表達(dá)了 article 的創(chuàng)建者和創(chuàng)建時間這層信息,它還表達(dá)了這個 article 是指定的人被創(chuàng)建的,而不是憑空生成的。

2016年5月5日
北京

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/17514.html

相關(guān)文章

  • 數(shù)據(jù)庫雜談如何優(yōu)雅進行結(jié)構(gòu)設(shè)計

    摘要:本文主要探討的是如何優(yōu)雅的設(shè)計表結(jié)構(gòu),讓人能夠直觀的從命名中窺探設(shè)計意圖,傳達(dá)設(shè)計者的設(shè)計目的,讓團隊成員達(dá)成共識,減少溝通成本。本文將從數(shù)據(jù)庫表的命名和字段的命名兩個方面展開。 本文首發(fā)于知乎專欄,轉(zhuǎn)載請注明出處 https://zhuanlan.zhihu.com/p/20785905 數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計作為后端軟件開發(fā)不可或缺的一環(huán),是每個后端工程師都會經(jīng)歷的過程。筆者也多次經(jīng)歷過...

    ormsf 評論0 收藏0
  • 權(quán)限設(shè)計雜談

    摘要:權(quán)限設(shè)計的雜談這篇文章的定位,不是宣傳某個框架,僅僅之是梳理一下有關(guān)權(quán)限方面的一些想法和最近項目中的一些探索過程。而這兩者的取舍則是有設(shè)計人員決定的。數(shù)據(jù)抽象原則最小特權(quán)劃分從某個程度上來說決定了控制的對象,而數(shù)據(jù)抽象原則是是決定了操作。 權(quán)限設(shè)計的雜談 這篇文章的定位,不是宣傳某個框架,僅僅之是梳理一下有關(guān)權(quán)限方面的一些想法和最近項目中的一些探索過程。我們主要想解決一下問題。 什么...

    yck 評論0 收藏0
  • 雜談:漸進增強與優(yōu)雅降級

    摘要:而漸進增強和優(yōu)雅降級兩種不同的開發(fā)流程,也是在我們項目初期做調(diào)研選型時會考慮的一個點。二者區(qū)別漸進增強和優(yōu)雅降級只是看待同種事物的兩種觀點。漸進增強和優(yōu)雅降級都關(guān)注于同一網(wǎng)站在不同設(shè)備里不同瀏覽器下的表現(xiàn)程度。 作為一名前端開發(fā)人員,最頭疼的莫過于瀏覽器兼容。遠(yuǎn)古時期萬惡的IE6,到現(xiàn)在CSS3不兼容的IE7/8.為了保證不同版本瀏覽器都有共同或更優(yōu)化的用戶體驗,前端搬磚的我們不得不與...

    hiyang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<