有個很有趣的問題,當實體中不是以聚合而是以查詢的方式會出現什麼讓我們忽視的問題。
還是續上次與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
- nginx是以多程式的方式來工作的Nginx
- 問個很次的問題,為什麼我在jsp裡的Integer下面找不到parseIntJS
- 模板中的名字查詢問題
- 在ArrayList的迴圈中刪除元素,會不會出現問題?
- 被忽視的開發安全問題
- 使用React Hooks你可能會忽視的作用域問題ReactHook
- 一個struct聚合的問題Struct
- 一個MySQL多表查詢的問題MySql
- banq老師 我想問一個很笨的問題關於#會話#跟蹤#的會話
- 彭老師幫看下我自己封裝了個JDBC的通用查詢,更新函式有沒有什麼問題。封裝JDBC函式
- 我們來看看翻譯中的問題
- MySQL 你可能忽視的選擇問題MySql
- 一個使用JDBC按Date查詢查詢的問題JDBC
- 面試官問我:什麼是訊息佇列?什麼場景需要他?用了會出現什麼問題?面試佇列
- 我們在講的 Database Plus,到底能解決什麼樣的問題?Database
- 為什麼忘記commit也會造成select查詢的效能問題MIT
- 關於 mysql 中的 rand () 查詢問題MySql
- Go記憶體架構,一個有趣的問題Go記憶體架構
- 查詢資料庫後是返回ResultSet實現中遇到的問題資料庫
- sql 一個說起來都知道,工作中容易忽視的問題SQL
- 原始碼分析 Mybatis 的 foreach 為什麼會出現效能問題原始碼MyBatis
- linux中查詢IP地址時出現所謂的“亂碼”問題Linux
- 什麼是以太坊?什麼是智慧合約?
- 當我問表單校驗的面試題時,我期望得到什麼樣的答案面試題
- 問個netbeans做的介面的問題 實在是不會了Bean
- 解決cef中title不現實tooltip的問題
- 當面試官說 “你還有什麼問題想問的”,你該如何回答?面試
- 當面試官說 “你還有什麼問題想問的” ,你該如何回答?面試
- 當面試官說“你還有什麼問題想問的”,你該如何回答?面試
- 大家快看哪,JClass的一段原始碼,不是程式碼有問題就是我有問題,不過我想我沒問題。原始碼
- 我的mysql有點問題MySql
- javascript 的問題 ,不知你會不會。JavaScript
- Mysql中的巢狀子查詢問題QSBSMySql巢狀
- Service Mesh是什麼,為我們解決了什麼問題?
- [諮詢問題] 有關 Allure 報告的技術問題,希望大家給點思路和具體的實現方法。