討論:動(dòng)態(tài)產(chǎn)生的持久模型和數(shù)據(jù)存儲(chǔ)的設(shè)計(jì)模式
動(dòng)態(tài)產(chǎn)生的持久模型和數(shù)據(jù)存儲(chǔ),這個(gè)詞語感覺挺晦澀的,不過估計(jì)在實(shí)際的項(xiàng)目中或者研發(fā)的產(chǎn)品中大家都碰到過這樣的場(chǎng)景:
例如在一個(gè)簡(jiǎn)單的考試系統(tǒng)中,出題人在系統(tǒng)中出題,答題人進(jìn)行相應(yīng)的答題。
問題:
這一個(gè)簡(jiǎn)單的場(chǎng)景映射到系統(tǒng)中通常會(huì)形成這樣的問題,出題人所出的題目其實(shí)就映射到了一個(gè)題目的持久模型,而答題人進(jìn)行答題時(shí)則是基于這個(gè)動(dòng)態(tài)產(chǎn)生的持久模型進(jìn)行的數(shù)據(jù)存儲(chǔ),這里的問題就是怎么去產(chǎn)生這個(gè)動(dòng)態(tài)的持久模型,怎么去將數(shù)據(jù)存儲(chǔ)到這個(gè)持久模型里去。
問題分析:
來看正常的情況下關(guān)于持久數(shù)據(jù)的做法,正常情況下,首先我們?cè)O(shè)計(jì)了一個(gè)表或PO,在保存數(shù)據(jù)時(shí)則可直接將相應(yīng)的數(shù)據(jù)保存至表中。
但在現(xiàn)在的場(chǎng)景下,這個(gè)表或PO需要在系統(tǒng)運(yùn)行時(shí)產(chǎn)生,之后數(shù)據(jù)才能象正常的情況那樣去保存。
解決方案:
根據(jù)上面的問題分析,一種解決方案顯而易見,就是動(dòng)態(tài)的產(chǎn)生表或PO,這種方案應(yīng)該是說難不難,說簡(jiǎn)單也不簡(jiǎn)單,這里最需要注意的是產(chǎn)生的表的字段的屬性的設(shè)置,以及在修改時(shí)表的字段的同步維護(hù),如果是動(dòng)態(tài)產(chǎn)生PO的話就比較麻煩,因?yàn)榘凑説ibernate的話,還需要生成hbm、修改hibernate.cfg.xml,并且還需要重載SessionFactory才能生效,這種解決方案在修改持久模型時(shí)要特別注意,就是數(shù)據(jù)的保持,很多時(shí)候采用版本策略也許更為適合。
另外一種解決方案也是經(jīng)常采用的,就是不去動(dòng)態(tài)的產(chǎn)生表或PO,而是提供一種通用的數(shù)據(jù)持久策略,一個(gè)簡(jiǎn)單的實(shí)現(xiàn)就是設(shè)計(jì)一張存儲(chǔ)數(shù)據(jù)的表,這張表的字段由字段名外鍵、字段值共同構(gòu)成,字段名外鍵關(guān)聯(lián)到動(dòng)態(tài)產(chǎn)生的持久模型的字段,字段值則為實(shí)際進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí)的值,這種方案很明顯的一個(gè)問題就是,會(huì)造成這張表的增長速度非常的塊,特別是在動(dòng)態(tài)產(chǎn)生的持久模型中有超多字段的時(shí)候,另外一個(gè)不是很方便的地方就是在查詢的時(shí)候很麻煩。
在實(shí)際項(xiàng)目中更傾向于第一種解決方案,不過在采用Hibernate之類ORM的時(shí)候第一種解決方案就比較麻煩了,第二種解決方案感覺更適用于動(dòng)態(tài)產(chǎn)生的持久模型字段比較少,實(shí)際產(chǎn)生的數(shù)據(jù)也比較少、查詢要求比較低的情況下。
?
不知道大家對(duì)于這種場(chǎng)景通常都會(huì)采用什么樣的解決方案呢?
ps:還有一個(gè)場(chǎng)景感覺也是常見的,就是需要?jiǎng)討B(tài)的擴(kuò)展目前已有的PO或表,不知道在這個(gè)場(chǎng)景中大家會(huì)采用什么樣的解決方案,預(yù)留字段?動(dòng)態(tài)修改表?關(guān)聯(lián)屬性擴(kuò)展表?抑或別的..........
例如在一個(gè)簡(jiǎn)單的考試系統(tǒng)中,出題人在系統(tǒng)中出題,答題人進(jìn)行相應(yīng)的答題。
問題:
這一個(gè)簡(jiǎn)單的場(chǎng)景映射到系統(tǒng)中通常會(huì)形成這樣的問題,出題人所出的題目其實(shí)就映射到了一個(gè)題目的持久模型,而答題人進(jìn)行答題時(shí)則是基于這個(gè)動(dòng)態(tài)產(chǎn)生的持久模型進(jìn)行的數(shù)據(jù)存儲(chǔ),這里的問題就是怎么去產(chǎn)生這個(gè)動(dòng)態(tài)的持久模型,怎么去將數(shù)據(jù)存儲(chǔ)到這個(gè)持久模型里去。
問題分析:
來看正常的情況下關(guān)于持久數(shù)據(jù)的做法,正常情況下,首先我們?cè)O(shè)計(jì)了一個(gè)表或PO,在保存數(shù)據(jù)時(shí)則可直接將相應(yīng)的數(shù)據(jù)保存至表中。
但在現(xiàn)在的場(chǎng)景下,這個(gè)表或PO需要在系統(tǒng)運(yùn)行時(shí)產(chǎn)生,之后數(shù)據(jù)才能象正常的情況那樣去保存。
解決方案:
根據(jù)上面的問題分析,一種解決方案顯而易見,就是動(dòng)態(tài)的產(chǎn)生表或PO,這種方案應(yīng)該是說難不難,說簡(jiǎn)單也不簡(jiǎn)單,這里最需要注意的是產(chǎn)生的表的字段的屬性的設(shè)置,以及在修改時(shí)表的字段的同步維護(hù),如果是動(dòng)態(tài)產(chǎn)生PO的話就比較麻煩,因?yàn)榘凑説ibernate的話,還需要生成hbm、修改hibernate.cfg.xml,并且還需要重載SessionFactory才能生效,這種解決方案在修改持久模型時(shí)要特別注意,就是數(shù)據(jù)的保持,很多時(shí)候采用版本策略也許更為適合。
另外一種解決方案也是經(jīng)常采用的,就是不去動(dòng)態(tài)的產(chǎn)生表或PO,而是提供一種通用的數(shù)據(jù)持久策略,一個(gè)簡(jiǎn)單的實(shí)現(xiàn)就是設(shè)計(jì)一張存儲(chǔ)數(shù)據(jù)的表,這張表的字段由字段名外鍵、字段值共同構(gòu)成,字段名外鍵關(guān)聯(lián)到動(dòng)態(tài)產(chǎn)生的持久模型的字段,字段值則為實(shí)際進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí)的值,這種方案很明顯的一個(gè)問題就是,會(huì)造成這張表的增長速度非常的塊,特別是在動(dòng)態(tài)產(chǎn)生的持久模型中有超多字段的時(shí)候,另外一個(gè)不是很方便的地方就是在查詢的時(shí)候很麻煩。
在實(shí)際項(xiàng)目中更傾向于第一種解決方案,不過在采用Hibernate之類ORM的時(shí)候第一種解決方案就比較麻煩了,第二種解決方案感覺更適用于動(dòng)態(tài)產(chǎn)生的持久模型字段比較少,實(shí)際產(chǎn)生的數(shù)據(jù)也比較少、查詢要求比較低的情況下。
?
不知道大家對(duì)于這種場(chǎng)景通常都會(huì)采用什么樣的解決方案呢?
ps:還有一個(gè)場(chǎng)景感覺也是常見的,就是需要?jiǎng)討B(tài)的擴(kuò)展目前已有的PO或表,不知道在這個(gè)場(chǎng)景中大家會(huì)采用什么樣的解決方案,預(yù)留字段?動(dòng)態(tài)修改表?關(guān)聯(lián)屬性擴(kuò)展表?抑或別的..........
posted on 2006-04-26 11:19 BlueDavy 閱讀(2680) 評(píng)論(4) 編輯 收藏 所屬分類: 系統(tǒng)設(shè)計(jì)