資訊唯一性原則

redorange發表於2010-05-11
本人偶然間想到,Google了半天也沒有找到相似的東西。在此拋磚引玉,望各位不吝賜教。

資訊唯一性原則是解耦合與促進一致性的資料結構設計方法。一個資訊只出現一次,其他地方只是引用。

比如客戶買書《xxx》這一業務,需要進行兩次相關操作,即書店將《xxx》這種書的數量減1,客戶賬戶中《xxx》這種書的數量加1。需要注意,這裡是《xxx》,是指一個種類,後面建模時提到的《xxx》是具體的賣出的那一本。

這個過程缺一不可,如果只讓書店減1,忘記了客戶加1,則客戶買不到書;反之,則是賣出的數量會超過書店的存貨。

在資料庫領域,採用ACID方式來解決,就是事務。將書店減1和客戶加1看作一個整體,其中一個操作失敗,就算這兩個操作整體失敗。這樣可以保證一致性。

你會發現,這一業務中,資料需要從兩處地方配合起來說明買賣的數量。這就產生了一個耦合。但通常我們認為這種耦合是天經地義的。

不過,耦合就意味著大量驗證,保持資訊唯一性原則或許可以減輕驗證的負擔。

經過分析,我們發現,這裡的加1減1實際上是買賣的那本《xxx》書的數量屬性。上面在處理業務時將賣出的那本《xxx》書忽略掉了,只將他其中的一個屬性儲存在了變數中。

在整個買賣過程中,《xxx》書的交換,其本質是賣出那本《xxx》書的所有人發生了變化。從書店變為了客戶。

因此,在資訊唯一性原則下,首先要建立賣出《xxx》書的實體,然後定義其數量和所有人。買賣的過程,就是所有人屬性發生變化了的過程。

這樣,書店的《xxx》這種書的總數,和客戶的《xxx》這種書的總數,就從直接影響業務的資料,變成了一個隨時可以重算的統計結果。他們共同受所有《xxx》書實體的所有人屬性和數量屬性的影響。

這樣,原來需要ACID事務支援的買賣業務,就變成了一個普通的業務。

同樣的道理,客戶付錢也是一樣。付款可以將人民幣建立一個實體,其數量就是《xxx》本書的賣出價格(可能會涉及打折等因素,與標價不一致,是每一本賣出《xxx》書的特有屬性)。

書的交換和錢的交換是同時發生的,但在資訊唯一性原則下並不需要ACID支援。如果書的所有人發生了變化,而錢忘記了。則在統計的過程中,應付賬款與已付賬款就有一個差額,賣家很容易判斷和發現。此時客戶可以再次付款,直到付款成功。反之,錢付了,而書忘了變換所有人,則也有差額,客戶的付款就變為了預付款。客戶可以用這個款項再去買書,直到買到為止。

資訊唯一性原則的本質在於,實事求是的將客觀世界發生的事情告訴計算機,記錄下每一個與業務相關的現象。這些現象作為計算的基礎。如果計算機忘了處理一些現象,那麼說明其認識的世界是殘缺的,但殘缺的世界也是可解釋和理解的。人類能夠修復其認識上的缺陷,從而保證其正確性。

相關文章