2012-04-03 137 views
1

我們舉一個例子,我們有兩個實體:ServiceProviderTelephoneNumber。該系統允許服務提供商添加電話號碼。由服務提供商添加的每個電話號碼由TelephoneNumber的實例表示。所以,我有這兩個實體之間的關聯。目前,我已經決定一個TelephoneNumber實例與一個服務提供者關聯。我還決定這兩個實體屬於相同的集合,其中ServiceProvider是聚合根(一個參數是TelephoneNumber生命週期取決於ServiceProvider實體)。遍歷方向和性能

我的問題是關於協會的遍歷方向。我事先知道服務提供商可能會添加數百萬個電話號碼。

如果關聯的遍歷方向是從ServiceProviderTelephoneNumber,如何以有效的方式實現?在ServiceProvider實體中存儲一組電話號碼效率不高(特別是對於內存)。可以使用延遲加載,但它會通過使用支持它的框架(例如Hibernate)來限制實現選項。

在一個已知的例子中,我們有CustomerOrder實體,通常會選擇從OrderCustomer的單向關聯。如果關聯的遍歷方向是從TelephoneNumberServiceProvider,那麼如何執行TelephoneNumber的CRUD操作?我想我們需要使用TelephoneNumberRepository?但是,我經常看到應該僅爲聚合根定義存儲庫,因爲我們通常會獲得聚合根實例,並且我們通過它與域模型進行通信。

感謝

+0

您使用的是關係數據庫嗎? – 2012-04-03 09:53:26

+0

@PreetKukreti是的,我們將在第一階段使用關係數據庫。 – 2012-04-03 11:31:24

+0

添加完後,您將如何訪問電話號碼?你會大量加載它們,只是其中一些符合特定標準...?你確定沒有什麼比電話號碼更多的電話號碼嗎?周圍沒有其他物體? – guillaume31 2012-04-04 15:33:15

回答

1

由於需要根據一些標準來訪問電話號碼,我不會吃驚地看到一個PhoneNumberRepository即使它不是一個聚合根。

另一方面,您可以直接在ServiceProvider中具有適當的FindPhoneNumberBy ...()方法。令我困擾的是,您無法一次加載大量電話號碼,這意味着您必須在ServiceProvider中引入某種性能管理(延遲加載/枚舉等),從而打破關注點分離。

獨立存儲庫的優點是,雖然接口將位於域層,但其具體實現將駐留在基礎結構層中,該層很好地將FindPhoneNumberBy ...()方法的契約與底層讀取技巧。總而言之,我無法真正看到一個比Repository更合理的候選人來處理這種東西。