比如:
有一個Company公司類,
Company公司類中有一個List<User>用戶列表,
User類中有一個Address類用于存放用戶的若干地址。
那么,現(xiàn)在有這樣一種系統(tǒng)設(shè)計思路:
傳一個公司id給后端,則在后端直接構(gòu)造出該公司實例以及其下所有用戶對象以及各個用戶對象下的所有地址信息。
最后生成的對象就像這樣:
Company{
User{
Address{}
Address{}
}
User{
Address{}
}
User{
Address{}
Address{}
Address{}
}
}
這樣設(shè)計有一個好處是你要使用的時候可以直接Company.User[i].Address[j]來調(diào)用你想用的信息。但是在構(gòu)造它的時候會耗費大量的數(shù)據(jù)庫查詢性能并且可能存在數(shù)據(jù)不同步問題。
想問下大家,這種系統(tǒng)設(shè)計思路,是否合理?
你好,我最近在寫一個java的orm框架,剛好也涉及到這方面的問題。我在之前設(shè)計的時候,也是考慮的獲取數(shù)據(jù)庫數(shù)據(jù)時一次性全部獲取出來,但我設(shè)計的時候遇到的如下問題:
考慮如下對象:
class Province{
private long id;
private City[] cities;
}
class City{
private long id;
private Country[] country;
}
在映射關(guān)系上,one-one映射和one-many映射比較好處理,但是如果有類似這樣多個映射關(guān)系 Province-->City-->Country 而且又包含集合的時候,保存時在設(shè)計上是非常復(fù)雜的.我有查看過nutzDAO的文檔,它的實現(xiàn)方式其實是將數(shù)組中的對象壓入隊列中作為單個對象插入,然而毫無疑問,如果插入大量數(shù)據(jù),這樣的性能肯定很底下.我在設(shè)計orm框架時就是覺得對于復(fù)雜的映射關(guān)系,不僅代碼復(fù)雜而且性能很難保證,所以決定棄用這種一次取出來和一次性保存的方式。
所以我最后設(shè)計的思想如下代碼:
class Province{
private long id;
}
class City{
private long id;
private long provinceId;
}
將外鍵僅僅當作普通的成員變量,在查詢時將外鍵作為條件查詢即可.保存時,先保存Province變量,獲取到id后,再插入City變量,設(shè)置他們的proviceId為獲取到的id即可.簡化設(shè)計也提高性能.
誠如你的問題所說,實際上很多時候我們并不需要提取相關(guān)的所有數(shù)據(jù),在性能和代碼復(fù)雜性做平衡考慮,實際上查詢數(shù)據(jù)時,單個表查詢,邏輯最清楚,程序員開發(fā)時也不容易出錯,可以根據(jù)自己的需要做定制.特別是對于企業(yè)項目,多個實體互相關(guān)聯(lián),如果一次性提取出來,可能數(shù)據(jù)量比較龐大,而程序員獲取只需要其中的一小部分數(shù)據(jù),這樣在性能上得不償失.
總結(jié)一下我的答案就是,為了簡單和性能著想,一次性取出所有數(shù)據(jù)(一次性保存實體所有相關(guān)實體數(shù)據(jù))增加代碼復(fù)雜性又增加了性能負擔(dān)。
另外本人最近參考了市面的一些orm框架,自己編寫了一款還處于快照期(API不穩(wěn)定)的Java開源ORM框架,限于社區(qū)規(guī)范,如果感興趣的可以私信本人交流哦。
另外再多提一嘴,本人最近看了國內(nèi)的幾個技術(shù)相關(guān)的社區(qū),感覺很多社區(qū)技術(shù)氛圍不是很好,披著程序員交流,技術(shù)交流的皮,但是幾乎都是各種灌水,交流,征婚,文風(fēng)跟貼吧簡直沒有區(qū)別. 更讓我覺得有些氣憤又有一些羞恥的是,有一些中國"開發(fā)者"在github上開源項目的的外國人(我不知道有沒有針對中國開發(fā)者github項目)的issue區(qū)發(fā)一些毫無意義的灌水帖,而且評論有十幾樓,完全中國式的文風(fēng)(例如有人評論"six,six,six","Please sit down, Mr. Chen","double click! six six six"),雖然底下也有幾位中國開發(fā)者為這樣的行為道歉,但看了這樣的行為,同作為國人,還是感覺到氣氛和羞恥的.
關(guān)注到segmentFault是剛好最近看到有一篇主題帖,講的就是因為用戶量增加,為了規(guī)范回答,會提出更加嚴格的提問規(guī)范.我知道對于在用戶量和技術(shù)氛圍上做平衡其實是一件很難的事情(根據(jù)比例原則,除非中國人的整體素質(zhì)大幅提升),因此非常希望segmentFault的管理團隊能夠盡力維持好整個社區(qū)的技術(shù)氛圍,我也決定將扎根segmentFault社區(qū),回答一些我力所能及的問題.
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。