有個很有趣的問題,當實體中不是以聚合而是以查詢的方式會出現什麼讓我們忽視的問題。
還是續上次與banq討論的那個問題
ForumBoard與ForumSubject是一對多的關係如果設計成聚合便是
ForumBoard{
private List<ForumSubject> forumSubjects;
public List<ForumSubject> searchSubjectByTitle(String title)
//這個便是根據聚合內元素來找尋相應的ForumSubject物件
}
但如果遇到大資料量時與聚合的方式設計便是不太適合這時候我們便會想到以查詢的方式不管事透過直接Repository還是
間接的DomainEvent模式還是什麼的這個方法變成了查詢來load這個物件
設計可能變成這樣
ForumBoard{
private String title;
public List<ForumSubject> searchSubjectByTitle(String title){
//透過某種方式從資料庫中load出物件
}
}
ok我透過我們設計做到了這點,但是有意思的問題總是藏得很深,深到讓你不容易發現。我發現這個問題也是在同事的使用當中發現的。
先看主題物件的結構
ForumSubject{
private String title;
private ForumBoard forumBoard;//這是個與板塊之間的關聯
public getForumBoard(){...};
}
好有趣的程式碼來了
ForumBoard 板塊 = loadForumBoard()從資料庫中load出ForumBoard
ForumSubject 主題 = 板塊.searchSubjectByTitle("某某主題");
ForumBoard forumBoard = 主題.getForumBoard();
forumBoard.title = "修改了板塊名";
assertEquals(forumBoard.title,板塊.title); //你猜會是什麼事情發生。不相等。
//答案就是當searchSubjectByTitle是以查詢的方式load物件時,我實際上是重現構建了個新的ForumSubject和ForumBoard之間的關係。他與原先的 板塊 物件之間是脫鉤的,這就使得 原先的 板塊 物件 與 重新load出來的ForumSubject物件內的板塊物件之間不存在任何關係。這就引申了個問題,當物件是聚合關係的時候我們ForumBoard物件內的引用關係是存在的,如果換成查詢的話這種關係便打破了。
也許這時候會有朋友站出來說可以再把他補回去嗎,如下:
ForumBoard{
private String title;
public List<ForumSubject> searchSubjectByTitle(String title){
//透過某種方式從資料庫中load出物件
ForumSubject 重建出來的板塊 = ForumSubject.getForumBoard();
Equals(重建出來的板塊,this)//對比下兩是否相等如果相等替換
ForumSubject.setForumBoard(this);
//這裡替換,但是如果我們找出來的資料量大呢,那我們這樣做所帶來的時間上的耗費將有多大
}
}
有趣吧,希望大家一起來研究看看有啥好的主意沒。
ForumBoard與ForumSubject是一對多的關係如果設計成聚合便是
ForumBoard{
private List<ForumSubject> forumSubjects;
public List<ForumSubject> searchSubjectByTitle(String title)
//這個便是根據聚合內元素來找尋相應的ForumSubject物件
}
但如果遇到大資料量時與聚合的方式設計便是不太適合這時候我們便會想到以查詢的方式不管事透過直接Repository還是
間接的DomainEvent模式還是什麼的這個方法變成了查詢來load這個物件
設計可能變成這樣
ForumBoard{
private String title;
public List<ForumSubject> searchSubjectByTitle(String title){
//透過某種方式從資料庫中load出物件
}
}
ok我透過我們設計做到了這點,但是有意思的問題總是藏得很深,深到讓你不容易發現。我發現這個問題也是在同事的使用當中發現的。
先看主題物件的結構
ForumSubject{
private String title;
private ForumBoard forumBoard;//這是個與板塊之間的關聯
public getForumBoard(){...};
}
好有趣的程式碼來了
ForumBoard 板塊 = loadForumBoard()從資料庫中load出ForumBoard
ForumSubject 主題 = 板塊.searchSubjectByTitle("某某主題");
ForumBoard forumBoard = 主題.getForumBoard();
forumBoard.title = "修改了板塊名";
assertEquals(forumBoard.title,板塊.title); //你猜會是什麼事情發生。不相等。
//答案就是當searchSubjectByTitle是以查詢的方式load物件時,我實際上是重現構建了個新的ForumSubject和ForumBoard之間的關係。他與原先的 板塊 物件之間是脫鉤的,這就使得 原先的 板塊 物件 與 重新load出來的ForumSubject物件內的板塊物件之間不存在任何關係。這就引申了個問題,當物件是聚合關係的時候我們ForumBoard物件內的引用關係是存在的,如果換成查詢的話這種關係便打破了。
也許這時候會有朋友站出來說可以再把他補回去嗎,如下:
ForumBoard{
private String title;
public List<ForumSubject> searchSubjectByTitle(String title){
//透過某種方式從資料庫中load出物件
ForumSubject 重建出來的板塊 = ForumSubject.getForumBoard();
Equals(重建出來的板塊,this)//對比下兩是否相等如果相等替換
ForumSubject.setForumBoard(this);
//這裡替換,但是如果我們找出來的資料量大呢,那我們這樣做所帶來的時間上的耗費將有多大
}
}
有趣吧,希望大家一起來研究看看有啥好的主意沒。
相關文章
- 什麼是以太坊
- 我在開發中常忽視的安全問題
- Beego 中容易被我們忽視的問題之 Memory 快取篇Go快取
- 一個有趣的問題, 你知道SqlDataAdapter中的Fill是怎麼實現的嗎SQLLDAAPT
- 一個有趣的this指向問題
- 一個有趣的鎖問題
- 被忽視的開發安全問題
- 一個MySQL多表查詢的問題MySql
- 使用React Hooks你可能會忽視的作用域問題ReactHook
- 在ArrayList的迴圈中刪除元素,會不會出現問題?
- MySQL 你可能忽視的選擇問題MySql
- linux中查詢IP地址時出現所謂的“亂碼”問題Linux
- 關於 mysql 中的 rand () 查詢問題MySql
- Go記憶體架構,一個有趣的問題Go記憶體架構
- 原始碼分析 Mybatis 的 foreach 為什麼會出現效能問題原始碼MyBatis
- 什麼是以太坊?什麼是智慧合約?
- 我們在講的 Database Plus,到底能解決什麼樣的問題?Database
- Antd的message.error 彈出的視窗不會關閉的問題Error
- 不可忽視的前端安全問題——XSS攻擊前端
- 解決cef中title不現實tooltip的問題
- Mysql中的巢狀子查詢問題QSBSMySql巢狀
- [諮詢問題] 有關 Allure 報告的技術問題,希望大家給點思路和具體的實現方法。
- 面試官問我:什麼是訊息佇列?什麼場景需要他?用了會出現什麼問題?面試佇列
- 當我問表單校驗的面試題時,我期望得到什麼樣的答案面試題
- gulimall出現的問題
- mysql 5.7.11查詢分割槽表的一個問題MySql
- 當面試官說“你還有什麼問題想問的”,你該如何回答?面試
- 當面試官說 “你還有什麼問題想問的” ,你該如何回答?面試
- 當面試官說 “你還有什麼問題想問的”,你該如何回答?面試
- [20210418]查詢v$檢視問題.txt
- Java中關於二分查詢的問題Java
- 我們希望智慧物聯中臺UCC解決什麼問題
- 演算法金 | 線性迴歸:不能忽視的五個問題演算法
- Service Mesh是什麼,為我們解決了什麼問題?
- 被忽視的問題:測試環境穩定性治理
- 當面試官問你這個問題的時候,他想聽到什麼?面試
- 請教一個讓我這個菜雞不解的問題
- Cookie出現兩個同名Key的問題Cookie
- sql一關聯多查詢時否定篩選出現的問題的解決SQL