當前位置:
首頁 > 知識 > 實體標識與資料庫主鍵

實體標識與資料庫主鍵

今天,我們將討論DDD意義上的身份與資料庫主鍵之間的區別。 我們經常將兩者混合在一起,但它們真的是一回事嗎?

實體標識

在DDD的背景下,標識是實體固有的東西。 只有實體擁有它; 它是用於區別於所有其他實體的唯一標識它們自己的東西。

例如,我們認為兩個人不同,不管他們擁有什麼「屬性」。 純粹巧合的是,它們可能具有相同的名稱,年齡,地址等。因此,我們仍然不會將它們視為同一個人。 每個人都有一種固有的標識,可以將他們與其他人區別開來。

但究竟是什麼呢?

問題是,你無法確定它。 你無法分辨出某人的標識。 這是設計的結果。 標識概念是: 每個標識必須是不可變的和全球唯一的 。

這就是人類如何用它來跟蹤我們需要跟蹤的對象的操作方式。 我們為每個事物分配一個無形的唯一標籤,然後使用該標籤標識該對象。

這也是你跟蹤人們的方式。 一個人可以進行巨大的轉變(例如,從一個孩子成長為一個完全成熟的成年人),你仍然知道它是同一個人。 那是因為當你第一次見到那個人時,你會給他們一個獨特的標識,即使在他自己徹底改變之後也不會改變。

由於這兩個特徵 - 不變性和唯一性 - 您無法真正使用任何實體的自然屬性作為其身份。 這些屬性往往會隨著時間而改變。 它們往往也不是唯一的。

想用這個人的全名作為他們的標識嗎? 不,名字不是唯一的。 社會安全號碼(SSN)?不,那些可以改變。

當然,在領域建模方面,您需要記住任何模型都只是 - 模型。 只是現實世界的簡化表示,複雜恰到好處。 您無需在模型中反映問題域的完整複雜性。

因此,可能在某個特定的領域模型中,使用人的SSN(或電子郵件)作為其標識就可以了。但那些往往是非常簡單的模型。 如果你處理任何或多或少複雜的事情,你將不可避免地遇到試圖調和所謂的不可變標識的變化的問題。 所有複雜系統都經歷了這樣的變化。

因此,一般而言,使用自然屬性(來自現實世界的屬性)並不是表示實體標識的好方法。它必須是無形的東西; 你人為地創建並分配給實體的東西,因此可以確保它既獨特又不可變。

資料庫主鍵

資料庫主鍵怎麼樣? 它與標識的概念有什麼關係?

它是一個完全獨立的概念,與DDD或域建模無關。

但事情就是這樣。 你需要以某種方式持久保存你的實體。 不僅保存,而且以後還原它們並能夠跟蹤他們的標識。 這意味著在此持續恢復周期期間,標識不得更改。

什麼資料庫功能可以讓你做到最好? 那是對的,主鍵。

事實證明,資料庫主鍵與領域驅動設計中標識概念的很近似。 資料庫提供持久性,允許您確保在持久化後標識不會更改。 主鍵特別有助於實現系統中所有標識的唯一性。 行的表名加上其主鍵可以很好地實現標識概念。

您可能聽說過在設計資料庫時從不使用自然主鍵的準則。 Martin Fowler在他的企業應用程序架構模式中寫到了這一點。 現在你知道了這個指南的來源。

自然主鍵不適合精確地表示標識,因為它們往往會隨著時間的推移而改變(如果只是錯誤的話),並且可能並不是那麼獨特。 代理主鍵可以更好地處理這些問題。 您可以在創建記錄時分配一次,然後在修改電子郵件或SSN等基本屬性後保持不可變。 它也很容易確保它們的獨特性,因為這些鍵應該看起來沒有外部約束。

值對象和標識

我們在這裡也提到值對象。 現在,我聽到你說:值對象沒有標識? 這是真的,但還有另一種方法可以看到這一點: 值對象的標識跨越其所有屬性 。

但是不存在矛盾嗎? 難道我沒有告訴你自然屬性不能成為一個好標識嗎?

這裡沒有矛盾,因為我們不需要跟蹤值對象。 它們是不變的。 只要您需要在值對象中引入更改,就可以創建一個新對象並用它替換舊的對象。

因為值對象是不可變的,所以我們自動滿足標識的第一個要求:不可變immutability。

獨特性唯一性怎麼樣? 我們如何實現它?

好吧,請記住值對象是可以互換的。 只要屬性匹配,我們就可以自由地替換另一個。 還有另一種方法可以查看:如果兩個值對象可以互換,則意味著它們是相同的。 他們有相同的標識。 否則,你將無法使用一個代替另一個(正如你不能使用一個約翰代替另一個約翰,除非他們是同一個人)。

因此,每個值對象的定義都是唯一的。 這給了我們標識的另一個組成部分。

因此: Value Object ==屬性== 標識Identity

實體標識與資料庫主鍵:總結

  • 實體的標識是無形的
  • 標識是不可變的,全球唯一的
  • 不要將自然屬性用作實體的標識。 它們隨著時間而變化,它們可能不是唯一的
  • 資料庫主鍵很接近標識的概念
  • 不要使用自然主鍵。 代理主鍵最適合實體的標識
  • 值對象的屬性是它自己的標識

實體標識與資料庫主鍵

打開今日頭條,查看更多精彩圖片
喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Drill-on-YARN之源碼解析
python中list,array,mat,tuple大小及類型

TAG:程序員小新人學習 |