日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
別再用數(shù)據(jù)庫生成的ID了

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

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

是時候徹底擺脫這個不良行為了。

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

用數(shù)據(jù)庫生成應(yīng)用ID會造成什么問題?

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

其次,在設(shè)計實體類時,你可能會使用不恰當(dāng)?shù)姆椒?,因為你想讓它與一個永久框架更兼容,比如說C# .NET中的實體框架。初級程序員犯的最嚴(yán)重的一個錯誤就是使用public Id setter方法來設(shè)置ID。

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

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

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

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

方法其實非常簡單,看下面的代碼:

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

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

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

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

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

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

圖源:unsplash

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


網(wǎng)頁題目:別再用數(shù)據(jù)庫生成的ID了
文章轉(zhuǎn)載:http://www.dlmjj.cn/article/djsehhc.html