自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

別再用數(shù)據(jù)庫(kù)生成的ID了

開(kāi)發(fā) 前端
很多人都曾經(jīng)至少有一次利用數(shù)據(jù)庫(kù)為應(yīng)用程序生成ID的經(jīng)歷。但事實(shí)上,這種做法在開(kāi)發(fā)應(yīng)用程序過(guò)程中是大錯(cuò)特錯(cuò),使用自動(dòng)遞增的整數(shù)ID會(huì)則錯(cuò)得更加離譜。

本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)。

很多人都曾經(jīng)至少有一次利用數(shù)據(jù)庫(kù)為應(yīng)用程序生成ID的經(jīng)歷。但事實(shí)上,這種做法在開(kāi)發(fā)應(yīng)用程序過(guò)程中是大錯(cuò)特錯(cuò),使用自動(dòng)遞增的整數(shù)ID會(huì)則錯(cuò)得更加離譜。

是時(shí)候徹底擺脫這個(gè)不良行為了。

可以肯定的是,這會(huì)與你在101 college平臺(tái)關(guān)系數(shù)據(jù)課上學(xué)到的知識(shí),以及你在youtube平臺(tái)上觀看的無(wú)數(shù)個(gè)如何用TerribleIds ()創(chuàng)建表格的視頻形成鮮明對(duì)比。

用數(shù)據(jù)庫(kù)生成應(yīng)用ID會(huì)造成什么問(wèn)題?

首先,最大的問(wèn)題是你把應(yīng)用程序中一個(gè)極其重要的部分授權(quán)給第三方軟件,在授權(quán)第三方責(zé)任時(shí),你已經(jīng)失去了對(duì)這個(gè)應(yīng)用程序的掌控權(quán)。

其次,在設(shè)計(jì)實(shí)體類(lèi)時(shí),你可能會(huì)使用不恰當(dāng)?shù)姆椒?,因?yàn)槟阆胱屗c一個(gè)永久框架更兼容,比如說(shuō)C# .NET中的實(shí)體框架。初級(jí)程序員犯的最嚴(yán)重的一個(gè)錯(cuò)誤就是使用public Id setter方法來(lái)設(shè)置ID。

別再用數(shù)據(jù)庫(kù)生成的ID了

第三,你突然要依靠第三方來(lái)給實(shí)體提供ID,這會(huì)把原本不復(fù)雜的單元測(cè)試變得復(fù)雜。假設(shè)你已經(jīng)發(fā)現(xiàn)使用public ID setter本質(zhì)上是一個(gè)嚴(yán)重的錯(cuò)誤,而你又不想通過(guò)調(diào)用代碼來(lái)設(shè)置ID。創(chuàng)建的類(lèi)看起來(lái)會(huì)如下所示:

別再用數(shù)據(jù)庫(kù)生成的ID了

你選擇的ORM仍然可以通過(guò)反射來(lái)設(shè)置id字段。要知道,有反射存在就沒(méi)有什么是真正安全的。

但該如何對(duì)此進(jìn)行單元測(cè)試?實(shí)例化時(shí)將id字段設(shè)置為0。實(shí)例化多個(gè)TerribleBook會(huì)出現(xiàn)身份沖突情況,因?yàn)楝F(xiàn)在不止一個(gè)TerribleBook具有相同的ID,即便他們代表兩個(gè)不同的實(shí)體。

如何生成更合適的ID并追回授權(quán)?

方法其實(shí)非常簡(jiǎn)單,看下面的代碼:

別再用數(shù)據(jù)庫(kù)生成的ID了

不是人人都能注意到TerribleBook到FixedBook之間的轉(zhuǎn)變,所以請(qǐng)認(rèn)真閱讀這段代碼。

首先,ID由整數(shù)變成字符串,這樣可以更好地實(shí)現(xiàn)伸縮性,但一定要限制數(shù)據(jù)庫(kù)中字段的長(zhǎng)度。永遠(yuǎn)不要對(duì)已知長(zhǎng)度的字段使用 VARCHAR(MAX)——它會(huì)占用內(nèi)存。

然后將構(gòu)造函數(shù)設(shè)為私有,并使用靜態(tài)工廠方法實(shí)例化新對(duì)象。這樣可以從調(diào)用者中抽象出實(shí)例化邏輯,甚至為我們提供了使用多態(tài)的機(jī)會(huì)——我們可能想返回某個(gè)Null對(duì)象而不是拋出。

注意,雖仍然把id當(dāng)作構(gòu)造函數(shù)參數(shù),但是ID的生成和提供是由我們來(lái)決定的(在第18行),而不是數(shù)據(jù)庫(kù)。

Guid.NewGuid()。ToString("D")只能確保獲得連字符格式的GUID。筆者喜歡用GUID,但是你可以自由構(gòu)建自己的ID,無(wú)論哪種ID都可以滿足你的業(yè)務(wù)和應(yīng)用程序需求。

現(xiàn)在,我們拿回了控制權(quán)。

[[334004]]

圖源:unsplash

或許你會(huì)說(shuō):“但是實(shí)體將不再按順序存儲(chǔ)!”這完全正確,但沒(méi)什么好擔(dān)心的。初級(jí)開(kāi)發(fā)人員喜歡有序存儲(chǔ)實(shí)體,即便這通常對(duì)業(yè)務(wù)不會(huì)產(chǎn)生任何影響。如果確實(shí)需要按順序存儲(chǔ)內(nèi)容,只需創(chuàng)建一個(gè)日期時(shí)間列即可。

 

責(zé)任編輯:趙寧寧 來(lái)源: 今日頭條
相關(guān)推薦

2020-12-04 10:05:00

Pythonprint代碼

2020-12-02 11:18:50

print調(diào)試代碼Python

2021-06-09 06:41:11

OFFSETLIMIT分頁(yè)

2020-12-07 06:05:34

apidocyapiknife4j

2023-10-26 16:33:59

float 布局前段CSS

2021-05-25 09:30:44

kill -9Linux kill -9 pid

2021-01-29 11:05:50

PrintPython代碼

2020-12-03 09:05:38

SQL代碼方案

2020-12-15 08:06:45

waitnotifyCondition

2025-01-03 08:13:08

2019-03-12 14:48:29

路由器XBOXPS4

2024-12-26 07:47:20

2020-05-19 17:09:33

Pandas大數(shù)據(jù)數(shù)據(jù)分析

2022-01-27 07:48:37

虛擬項(xiàng)目Django

2022-03-10 10:12:04

自動(dòng)化腳本Bash

2024-06-12 13:54:37

編程語(yǔ)言字符串代碼

2022-10-27 21:34:28

數(shù)據(jù)庫(kù)機(jī)器學(xué)習(xí)架構(gòu)

2023-06-26 08:20:02

openapi格式注解

2023-09-08 08:35:42

層疊樣式表CSS

2023-09-14 12:03:30

空指針判空
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)