跟瀾|‘上‹¹è¡Œçš„å¦ç”Ÿé€‰è¯¾è¡¨çš„例åå¤ä¹ 了一下: http://www.cnblogs.com/buzaixian/archive/2009/09/21/1571365.html
˜q™ç¯‡æ–‡å—在网上被转è²çƒ‚了åQŒé‡Œé¢æœ‰äº›sql适åˆç”¨åœ¨åº”用¾pÈ»Ÿé‡Œï¼Œæœ‰äº›â€œæŠ¥è¡¨â€çš„æ„?觉更é‡äº›åQŒä¸»è¦æ˜¯æƒ›_¤ä¹ å‰è€…。å‰20æ¡å¤§ä½“还挺好åQŒåŽ30æ¡æ˜Žæ˜‘ÖæŠ¥è¡¨é£Žæ ¼äº†ï¼Œè€?且åŽé¢é€‰ä¾‹è‰¯èŽ ä¸é½åQŒé€‰äº†12个例ååš¾lƒä¹ åQŒï¼ˆå…¶å®žå¾ˆå¤šè¯æ³•åQŒcase, any/all, union之类的都没包括)åQŒç”¨mysqlæ•°æ®åº“,òq¶å…±äº«è‡ªå·±é€ 出æ¥çš„æ•°æ®ã€‚关于这12æ?sql, ä¿®æ£äº†åŽŸæ–‡ä¸æœ‰çº°æ¼çš„地方ã€?
sql是基本技能,若能写得好也挺精彩的åQŒè¿˜åœ¨ç‘ô¾lç»ƒä¹ ã€‚ç»ä¸æå€¡åŠªåŠ›å†™å¤æ‚sql 解决业务问题。应用系¾lŸé‡Œå¦‚æžœå˜åœ¨å¾ˆå¤æ‚çš„sqlåQŒå¾€å¾€æç¤ºäº†ä¸šåŠ¡é€»è¾‘å‘下泄露 到sql层的问题åQŒä¸åˆ©äºŽ¾l´æŠ¤å’Œæ‰©å±•,虽然˜q™æ ·¼‹®å®žå¸¸èƒ½æé«˜˜q行效率。具体情å†?自行å–èˆã€?
下é¢çš„例å都是比较通用的sql, 其实针对特定的数æ®åº“åQŒéœ€è¦å¦çš„也挺多åQŒæ¯”å¦?oracle dbçš„decode函数, rowid, rownum, connect by 虽然ä¸é€šç”¨åQŒä½†æ˜¯å¾ˆå®žç”¨ã€?
æ•°æ®å¯ä»¥åœ¨è¿™é‡Œä¸‹è½½ï¼Œåªæ˜¯ç”¨ä½œ¾lƒä¹ åQŒæ²¡åšä“Q何外键关è”:http://115.com/file/an2svxbe#sql-study.sql
æ•´ç†çš„sql在下é¢ï¼š
Student(S#,Sname,Sage,Ssex) å¦ç”Ÿè¡?
Course(C#,Cname,T#) 评¡¨‹è¡?
SC(S#,C#,score) æˆç‡Wè¡?
Teacher(T#,Tname) 教师�
1. 选出æ¯é—¨åŠŸè¯¾éƒ½åŠæ ¼çš„å¦å·
select distinct `s#` from sc where `s#` not in (select `s#` from sc where score <60)
2. 查询â€?â€è¯¾½E‹æ¯”â€?â€è¯¾½E‹æˆ¾l©é«˜çš„æ‰€æœ‰å¦ç”Ÿçš„å¦å·åQ?
SELECT c01.`s#` from (select `s#`, `score` from sc where `c#`=1) c01,
(select `s#`, `score` from sc where `c#`=2) c02
where c01.`s#` = c02.`s#` and c01.score > c02.score
3. 查询òq›_‡æˆç‡W大于60分的åŒå¦çš„å¦å·å’Œòq›_‡æˆç‡WåQ?
select `s#`, avg(score) from sc group by `s#` having avg(score) > 60
4. 查询所有åŒå¦çš„å¦å·ã€å§“åã€é€‰è¯¾æ•°ã€æ€ÀLˆ¾l©ï¼›
select student.`s#`, student.`Sname`, count(`c#`), sum(score) from student left outer join sc on student.`s#` = sc.`s#` group by student.`s#`, sc.`s#`
5.查询没妘q‡â€œå¶òq³â€è€å¸ˆè¯„¡š„åŒå¦çš„å¦å—÷€å§“åï¼›
select student.`s#`, student.`Sname` from student where student.`s#` not in (select distinct(sc.`s#`) from teacher, course, sc where Tname='å¶åã^' and teacher.`t#` = course.`t#` and sc.`c#`= course.`c#` )
6. 查询å¦è¿‡â€?01â€åƈ且也å¦è¿‡¾~–å·â€?02â€è¯¾½E‹çš„åŒå¦çš„å¦å—÷€å§“å?
select student.`s#`, student.sname from student, sc where student.`s#` = sc.`s#` and sc.`c#` = 1 and exists (select * from sc sc_2 where sc_2.`c#`=2 and sc.`s#`=sc_2.`s#`)
7. 查询å¦è¿‡â€œå¶òq³â€è€å¸ˆæ‰€æ•™çš„æ‰€æœ‰è¯¾çš„åŒå¦çš„å¦å·ã€å§“å?(巧妙)
select `s#`, sname from student where `s#` in
(select `s#` from sc, teacher, course where tname='å¶åã^' and teacher.`t#`=course.`t#` and course.`c#`= sc.`c#` group by `s#` having count(sc.`c#`)=
(select count(`c#`) from teacher, course where tname='å?òq? and teacher.`t#`=course.`t#`) )
8. 查询评¡¨‹¾~–å·â€?02â€çš„æˆç‡W比课½E‹ç¼–å·â€?01â€è¯¾½E‹ä½Žçš„æ‰€æœ‰åŒå¦çš„å¦å·ã€å§“å?(有代表æ€?
select `s#`, sname from (select student.`s#`, student.sname, score, (select score from sc sc_2 where student.`s#`=sc_2.`s#` and sc_2.`c#`=2) score2 from student , sc where
sc.`s#`=student.`s#` and sc.`c#`=1) s_2 where score2 < score
9.查询没有å¦å…¨æ‰€æœ‰è¯¾çš„åŒå¦çš„å¦å·ã€å§“å?
select student.`S#`, Sname from student, sc where student.`s#` = sc.`s#` group by `s#`, sname having count(`c#`) < (select count(`c#`) from course)
10. 查询臛_°‘有一门课与å¦å·äØ“â€?02â€çš„åŒå¦æ‰€å¦ç›¸åŒçš„åŒå¦çš„å¦å·å’Œå§“ååQ?
select distinct(sc.`s#`), sname from student, sc where student.`s#`=sc.`s#` and `c#` in (select `c#` from sc where `s#`=002)
11. 把“SCâ€è¡¨ä¸â€œå¶òq³â€è€å¸ˆæ•™çš„评¡š„æˆç‡Wéƒ½æ›´æ”¹äØ“æ¤è¯¾½E‹çš„òq›_‡æˆç‡WåQ?
update sc inner join
(select sc2.`c#`, avg(sc2.score) score from sc sc2, teacher, course where
sc2.`c#`=course.`c#` and tname='å¶åã^' and teacher.`t#` = course.`t#` and course.`c#`=sc2.`c#` group by course.`c#`) sc3 on sc.`c#`=sc3.`c#` set sc.score=sc3.score
12. 查询2åïLš„åŒå¦å¦ä¹ 的课½E‹ä»–都å¦äº†çš„åŒå¦çš„å¦åøP¼›åQˆæ³¨æ„ç†è§£ï¼šwhereè¯å¥çš?½W¬ä¸€ä¸ªæ¡ä»¶è¿‡æ»¤æŽ‰ä¸æ»¡‘³c#的记录,å†group byåQŒå°±æ¯”较清晰åQ?
select `S#` from SC where `C#` in (select `C#` from SC where `S#`=2)
group by `S#` having count(*)=(select count(*) from SC where `S#`=2);
æ™ø™”æ‹›è˜çš„原链接åQ?http://jobs.zhaopin.com/P2/CC0003/1191/J902/509/CC000311917J90250983000.htm?f=ss
软äšg分æžå¸ˆA
Job Responsibilities:
The mission of this role is to improve the customer competence of SAS. You are expected and will be cultivated to be an expert who understands SAS technology/solution, globalization and the domain knowledge. In more details, duties will include:Conducts customer experience testing and best practice testing for SAS technologies and solutions;
Qualifications:
Preferences:
å‘é€ç®€åŽ†è‡³:bjrnd@sas.com
[fangang]我们评äh高质é‡ä»£ç 有三è¦ç´ :å¯è¯»æ€§ã€å¯¾l´æŠ¤æ€§ã€å¯å˜æ›´æ€§ã€?/p>
[vcycyv]åŒæ„˜q™ä¸‰ä¸ªæ–¹é¢ã€‚我总这æ ähƒ³åQŒèÊYä»¶çš„æ ¸å¿ƒæ˜¯å¯¾l´æŠ¤æ€§ã€‚対l´æŠ¤æ€§ä¸»è¦å°±ä½“现在å¯è¯ÀL€§å’Œæ‰©å±•性ã€?/p>
[fangang]åQˆå¯è¯ÀL€§ï¼‰ä¸è¦¾~–写大段的代ç ?/p>
[vcycyv]Martin Fowler½Ž?从大ŒDµä»£ç 抽å–独立的æ–ÒŽ³•"å«åš"extract method"åQŒè¿™æ˜¯å¸¸è§è€Œé‡è¦çš„釿ž„手段。在他的refactor书里从技术层é¢åšäº†è¯¦¾l†çš„é˜è¿°ã€‚分解的˜q‡ç¨‹ä¸ï¼Œæ¯”较å®ÒŽ˜“å½¢æˆæŠ€æœ¯éšœ¼„çš„local variable. 引一ŒDµä¹¦é‡Œçš„è¯ï¼Œä¸“门讨论˜q™ä¸ªè¯é¢˜çš„:
�nbsp; Copy the extracted code from the source method into the new target method.
�nbsp; Scan the extracted code for references to any variables that are local in scope to the
source method. These are local variables and parameters to the method.
�nbsp; See whether any temporary variables are used only within this extracted code. If so,
declare them in the target method as temporary variables.
�nbsp; Look to see whether any of these local-scope variables are modified by the extracted
code. If one variable is modified, see whether you can treat the extracted code as a query
and assign the result to the variable concerned. If this is awkward, or if there is more than
one such variable, you can't extract the method as it stands. You may need to use Split
Temporary Variable and try again. You can eliminate temporary variables with
Replace Temp with Query (see the discussion in the examples).
�nbsp; Pass into the target method as parameters local-scope variables that are read from the
extracted code.
�nbsp; Compile when you have dealt with all the locally-scoped variables.
�nbsp; Replace the extracted code in the source method with a call to the target method.
�nbsp; Compile and test.
å‰ä¸¤òq´çœ‹åˆîC¸€ä¸ªè®¨è®ºçš„很ç«çš„è¯é¢˜ï¼Œè¯´ä“Qæ„夿‚的产å“åQŒéƒ½èƒ½break into一¾pÕdˆ—çš„å°æ–ÒŽ³•åQŒæ¯ä¸ªæ–¹æ³•行æ•îC¸‘…过5行。当然没必覘q™ä¹ˆç‹ ï¼Œä½†å¦‚æžœä½ çœŸè¿™ä¹ˆç‹ åQŒæˆ‘倒觉得没啥明昄¡š„å处ã€?/p>
"而一些更有ç»éªŒçš„½E‹åºå‘˜ä¼šé‡‡ç”¨å¦å¤–一¿U从上往下的¾~–写方å¼ã€‚当他们在编写程åºçš„æ—¶å€™ï¼Œæ¯ä¸ªè¢«åˆ†å‡ºåŽ»çš„ç¨‹åºï¼Œå¯ä»¥æš‚æ—¶åªå†™ä¸€ä¸ªç©º½E‹åºè€Œä¸åŽÕd…·ä½“实现功能。当ä¸È¨‹åºå®Œæˆä»¥åŽï¼Œå†ä¸€ä¸ªä¸ªå®žçŽ°å®ƒçš„æ‰€æœ‰å½E‹åºã€‚采用这æ ïLš„¾~–写方å¼åQŒå¯ä»¥ä‹É夿‚½E‹åºæœ‰æ›´å¥½çš„规划åQŒé¿å…åªè§æ ‘木ä¸è§æ£®æž—的弊病ã€?˜q™ä¹Ÿæ˜¯ä¸€ä¸ªå¥½çš„实è·üc€?
æåˆ°˜q™ç§è‡ªä¸Šè€Œä¸‹çš„ç¼–½E‹æ–¹æ³•,™åÞZ¾¿æŽ¨è 《斯å¦ç¦å¤§å¦å¼€æ”¾è¯¾½E‹ï¼š¾~–程æ–ÒŽ³•》。这是一¾pÕdˆ—视频教程。google一下有很多地方å¯ä»¥ä¸‹è²æˆ–在¾U¿è§‚看,比如优酷http://v.youku.com/v_show/id_XMjE4NzQ0NDI0.html 在视频教½E‹é‡Œæ•™æŽˆä¹Ÿæ¼”½CÞZº†è‡ªä¸Šè€Œä¸‹çš„ç¼–½E‹æ–¹æ³•ã€?˜q™æ˜¯å…¥é—¨¾U§çš„æ•™ç¨‹åQŒæœ¬æ¥æƒ³é€šè¿‡å®ƒç»ƒ¾lƒå¬åŠ›ï¼ŒåŽæ¥å‘现˜q™è¯¾½E‹æ ¹æœ¬å°±æ˜¯å–œå‰§ç‰‡åQŒçœ‹çš„过½E‹ä¸€ç›´ç‹‚½W‘,教授牚w€—ã€?
è·Ÿå¯è¯ÀL€§ç›¸å…³çš„一个è¯é¢˜å°±æ˜¯æ³¨é‡Šã€‚è¿‘òq´æ¥ä¸€ä¸ªå¹¿æ³›è¢«æŽ¥å—çš„åšæ³•是åQŒå°½é‡é€šè¿‡ é¿å…大段代ç 以åŠè‰¯å¥½çš„å˜é‡å‘½å达到å¯è¯ÀL€§ã€‚注释在˜q™ä¸ª˜q‡ç¨‹ä¸è¢«æ·¡åŒ–äº†ã€‚æˆ‘åŸºæœ¬åŒæ„˜q™ç§å𿳕åQŒç¨‹åºç»“构清晎ͼŒè‡ªè§£é‡Šçš„å˜é‡å都是é‡è¦çš„实践。å˜é‡åž®½é‡ä¸è¦å†™ç¾ƒå†™ï¼Œå¦‚果写羃写的è¯ï¼Œä¸€å®šè¦æœ?strong>¾~©å†™å—典有æ®å¯æŸ¥ã€‚看spring的代ç ,å¯ä»¥å‘现很多¾cÕd或方法ååœ?0个嗽W¦ä»¥ä¸Šã€‚大ŒD‰|³¨é‡Šå¾€å¾€æš—示½E‹åº¾l“构的ä¸åˆç†ã€‚ä¸é¼“励写过多注释的¾l“æžœž®±æ˜¯åQŒå‰©ä¸‹çš„æ³¨é‡Šéƒ½æ˜¯é‡è¦ä¸å¯æˆ–缺的,注释是程åºçš„一部分åQŒéœ€è¦å’Œ½E‹åºä¿æŒä¸€è‡ß_¼Œä¹Ÿéœ€è¦è¢«¾l´æŠ¤ã€‚å¦ä¸€ä¸ªåŸºæœ¬è€Œé‡è¦çš„åŽŸåˆ™æ˜¯ï¼Œè¦æŠŠpublic package protected privateæ–ÒŽ³•按照™åºåºå†™ã€‚æ›´é‡è¦çš„ã€å¯è®‰K—®æ€§æ›´é«˜çš„æ–ÒŽ³•攑։é¢ï¼Œž®½ç®¡eclipse里å¯ä»¥æ–¹ä¾¿åœ°åœ¨è§†å›¾è¿‡æ»¤éžpublicæ–ÒŽ³•ã€?
[fangang](å¯ç»´æŠ¤æ€?但是åQŒäº‹å®žå´ä¸ä¸€æ øP¼Œå¯ÒŽœºå…³çñ”‹Æ¡è®¡½Ž—的代ç é布整个™å¹ç›®åQŒç”šè‡Ïxœ‰äº›è¿˜å†™å…¥åˆîCº†é‚£äº›å¤æ‚çš„SQLè¯å¥ä¸ã€?
[vcycyv] Domain Driven Disignå¼ø™°ƒåQŒdomain的逻辑è¦åœˆåœ¨ä¸€å®šè¾¹ç•Œä¸ã€‚往上ä¸èƒ½çˆ¬åˆ°service, 甚至UI层。往下ä¸èƒ½æ¸—é€åˆ°repository以下åQŒæ¯”如sqlè¯å¥é‡Œã€?Domain Driven Design的书åœ?a >˜q™é‡Œä¸‹è²ã€‚更多电å书å¯ä»¥çœ‹ä¹‹å‰å†™çš„åšå®?分äínå二本ç»å…¸ç”µå书
[fangang]ž®†ä¸“ç”¨ä»£ç æå‡äؓ通用代ç
[vcycyv] ˜q™ä¸ª˜q‡ç¨‹å¤§å®¶éƒ½ä¼šé‡åˆ°ã€‚什么代ç 算通用代ç òq¶ä¸å®ÒŽ˜“ç•Œå®šã€‚è¿‡å¤šçš„é€šç”¨ä»£ç æ·Ò޲¡äº†çœŸæ£æœ‰é€šç”¨æ„义的方法,ä¸èƒö的通用代ç å®ÒŽ˜“é€ æˆä»£ç é‡å¤ã€‚这个过½E‹æœ‰˜q™ä¹ˆå‡ 个斚w¢éœ€è¦æ³¨æ„ã€?
一åQŒé¿å…é‡å¤é€ è½®åã€?è¦å¯¹JDK常用的API以劾lå…¸½W¬ä¸‰æ–¹çš„软äšg包有一定了è§?/strong>。ä‹D两个例ååQšå¤å…¸çš„singleton在JDK1.5之åŽå¯ä»¥ç”¨å•ä¸€å…ƒç´ çš„enum表示åQŒè€Œä¸”ä¸ç”¨è€ƒè™‘serializableçš„readresolve问题åQ?apache commons里的io, lang½{‰åŒ…æä¾›äº†å¾ˆå¤šå¸¸ç”¨çš„API。我在我们的产å“里,用到ioçš„FileNameUtilså’ŒExceptionUtilsçš„ä¸€äº›æ–¹æ³•ã€‚åŒ…æ‹¬å–æ–‡äšgåŽç¼€å,获å–exceptionçš„root cause以åŠexcepiton stack的嗽W¦ä¸²ã€?è¦å°½é‡é‡ç”¨å¯é çš„½W¬ä¸‰æ–¹ä»£ç , åŽŸå› æ˜¯ä½ è‡ªå·±å†™çš„ä»£ç 多åŠä¸å¦‚Sunå’Œapacheçš„äh好。更é‡è¦çš„æ˜¯åQŒä½ 自己写的æ¯ä¸€è¡Œcode都è¦è‡ªå·±¾l´æŠ¤ã€‚代ç 行数本íw«å°±æ˜¯ä»£ç 维护é‡çš„ä¸€ä¸ªå› ç´ ã€‚æœ€˜q‘一两年疯狂地喜‹Æ¢åˆ 除代ç ,估计å†å‘展下åŽÀLˆ‘ž®Þp¦è¢«åˆ 除了ã€?
二, ˜q˜æ˜¯domain为先ã€?strong>å½“ä½ çŠ¹èõU一ŒD‰|¯”较“通用â€çš„代ç 应该攑֜¨module里还是拿出æ¥çš„æ—¶å€™ï¼Œž®½é‡˜q˜æ˜¯ä¿ç•™åœ¨module里å§ã€‚å› ä¸ºå¦‚æžœä½ çŠ¹èõUæ¥ï¼ŒçйèõUåŽÖM¹‹åŽï¼Œå†›_®šå®ƒæ˜¯global的通用代ç åQŒä¸‹ä¸€ä¸ªähéžå¸¸å¯èƒ½åœ¨module里找ä¸åˆ°åQŒå°±è®¤äؓ没有˜q™ç§code,自己åˆå†™ä¸€é。太‹È€˜q›çš„å†™ä¸€å †é€šç”¨ä»£ç åQŒä¸€æ—¦ç»„¾l‡ä¸å¥½ï¼Œž®±æ²¡äººçˆ±åŽÖM»Žé€šç”¨ä»£ç 里寻å®äº†ã€‚关于这一点,martin大唿œ‰è¿‘似的é˜è¿°åQ?åœ?a >Patterns of Enterprise Application Architectureé‡?
A common concern with domain logic is bloated domain objects. As you build a screen to manipulate orders you'll notice that some of the order behavior is only needed only for it. If you put these responsibilities on the order, the risk is that the Order class will become too big because it's full of responsibilities that are only used in a single use case. This concern leads people to consider whether some responsibility is general, in which case it should sit in the order class, or specific, in which case it should sit in some usage-specific class, which might be a Transaction Script (110) or perhaps the presentation itself.
The problem with separating usage-specific behavior is that it can lead to duplication. Behavior that's separated from the order is harder to find, so people tend to not see it and duplicate it instead. Duplication can quickly lead to more complexity and inconsistency, but I've found that bloating occurs much less frequently than predicted. If it does occur, it's relatively easy to see and not difficult to fix. My advice is not to separate usage-specific behavior. Put it all in the object that's the natural fit. Fix the bloating when, and if, it becomes a problem.
三ã€é€šç”¨ä»£ç ä¸€å®šè¦æœ‰æ•´ä½“设计。如果调用通用代ç 的那些invokerä¸å®Œå…¨åœ¨ä½ 控制的范围åQŒæ¯”å¦‚ä½ å†™çš„½E‹åºæœ‰å…¶ä»–é¡¹ç›®ç»„åœ¨è°ƒç”¨ï¼Œé‚£ä¹ˆä½ ä¿®æ”¹APIçš„ç¾å一定会被骂æÈš„。所以通用代ç è¦æ€å‰æƒ›_Ždesign清楚了æ‰release.¾l“构清楚的通用代ç ä¹Ÿæ¯”è¾ƒæ–¹ä¾¿ä»¥åŽæŸ¥æ‰¾ã€?strong>好的½E‹åºæ€ÀL˜¯åˆ†å±‚的,通用代ç è¦å°½é‡å¾€åº•层æ”?/strong>ã€?
[fangang]一个快速æé«˜èÊYä»¶è´¨é‡çš„æ·å¾„ž®±æ˜¯åˆ©ç”¨è®¾è®¡æ¨¡å¼ã€?
[vcycyv]设计模å¼é™¤äº†æ˜¯ä¸€¿U工具以外,å¦ä¹ ã€æ€è€ƒè®¾è®¡æ¨¡å¼èƒ½æ‰©å±•codingçš„æ€ç»´æ–¹å¼ã€‚自å·×ƒ¹Ÿæ€È»“了一½‹‡åšå®?串讲23¿U设计模å¼?/a> ã€?
[vcycyv]哈哈åQŒæˆ‘喜欢˜q™ä¸ªä¾‹å。DDDçš„æ ¸å¿ƒæ€æƒ³ž®±æ˜¯˜q™ä¸ªã€‚当然DDDçš„ç†è®ø™¿˜æœ‰ä¸€äº›å…·ä½“的实践。Eric Evan在他的DDD书里讲了一个cargo的例å,当时我还找了一下代ç ,没找刎ͼŒä»Žfangangçš„åšå®¢è¯„论里居然å‘现哪里能找åˆîC»£ç 了åQ?a title="http://dddsample.sourceforge.net/" >http://dddsample.sourceforge.net/, ˜q˜æ²¡æ¥å¾—åŠå…·ä½“çœ‹ã€‚ä»¥åŽæœ‰æœÞZ¼šæ·±å…¥äº†è§£ä¸€ä¸‹ã€?
[fangang]åQˆä»£ç 审查) 被审查åŽçš„代ç 如果还出现¾~ºé™·åQŒå®¡æŸ¥è€…应当负有责ä»?
[vcycyv] ˜q™ä¸ª¾pÕdˆ—的最åŽä¸€½‹‡æ–‡ç« 主题是代ç 审查。作者所说的最佛_®žè·µå¾ˆæœ‰é“ç†ï¼Œä½†ä¸æ˜¯åœ¨ä»ÖM½•çŽ¯å¢ƒä¸‹å¯æ“作性都强的。我ä¸çŸ¥é“最佛_®žè·‰|˜¯ä»€ä¹ˆï¼Œä½†æˆ‘觉得有一些问题是值得注æ„çš„ã€?
一ã€?strong>代ç 审查的范围覞®ï¼Œæœ€å¥½æ˜¯one-oneçš?/strong>åQŒè·Ÿ¾l©æ•ˆæ²¡æœ‰å…³ç³»åQŒèŒƒå›´å°å¯ä»¥ä¿è¯å®¡æŸ¥ä¸ä¼šå¤ªä¼¤â€œé¢åâ€ï¼Œå¦åˆ™ä¼šåª„å“团¾l“氛围ã€?
二ã€?strong>å®¡æŸ¥è€…åœ¨æŒ‡å‡ºé”™è¯¯çš„åŒæ—Óž¼Œä¸€å®šè¦è¯´å¦‚何修æ£é—®é¢?/strong>。我éžå¸¸éžå¸¸å感那ç§å–„于用大é“ç†æŒ‡å‡ºåˆ«äh错误åQŒè‡ªå·±å´æŠŠé”™è¯¯çŠ¯å¾—æ›´å¤¸å¼ çš„é‚£¿Uähã€‚å¦‚æžœä½ è‡ªå·±æ²¡æœ‰æ›´å¥½çš„è§£å†Ïx–¹æ¡ˆï¼Œž®±åˆ«è¯´é‚£æ˜¯é—®é¢˜ã€?
三ã€ä»£ç å®¡æŸ¥åˆ¶åº¦çš„æŽ¨è¡Œä»¥è‰¯å¥½çš„å›¢é˜Ÿæ°›å›´ä¸ºå‰æã€‚å¤§å®‰™ƒ½æ˜¯äؓ了äñ”å“ç€æƒ»I¼Œ˜q™æ ·ä»£ç 审查æ‰ä¸è‡³äºŽæ‰¯çš®ã€?
å››ã€å…³äºŽå®¡æŸ¥è€…的责ä“Qã€‚æˆ‘åŒæ„fangang说的"被审查åŽçš„代ç 如果还出现¾~ºé™·åQŒå®¡æŸ¥è€…应当负有责ä»?, ä½†æ˜¯è°æ¥˜q½ç©¶è´£ä“QåQŒå¦‚何界定责任,怎么˜q½ç©¶è´£ä“Q呢?呵呵åQŒè¿™ä¸ªææ€•ä¸å¥½æ“作。代ç 审查显然ä¸èƒ½æœ¾ldefect, 但是明显的设计,¾~–ç 错误是应该看到的åQŒä½†æ€Žä¹ˆåˆç®—"明显"呢。èÊY件本íw«ä¸åƒæ•°å¦é‚£æ ·ä¸¥æ û|¼Œå®ÒŽ˜“界定问题。纪律在软äšg行业作用有é™åQŒå›¢é˜Ÿæ°›å›´æ¯”¾Uªå¾‹é‡è¦ã€‚但怎么è¥é€ å¥½çš„å›¢é˜Ÿæ°›å›´åˆæ˜¯ä¸€ä¸ªå¤ªå®½æ³›çš„问题ã€?
˜q™ä¸ªå¸–å很牛åQ?/p>
http://www.itpub.net/viewthread.php?tid=1313696&extra=&page=1
我的观点是,外键在åˆå§‹é˜¶ŒDµèƒ½åŠ çš„éƒ½åŠ ä¸Šï¼Œåªæœ‰˜q«ä¸å¾—已的时候æ‰disable或drop掉。é‡åˆ°æ€§èƒ½ç“‰™¢ˆçš„æ—¶å€™ï¼Œž®½é‡é‡‡ç”¨å…¶å®ƒæ–¹å¼è°ƒä¼˜åQŒè€Œä¸è¦è½»æ˜“牺牲掉外键。有外键¾U¦æŸçš„æ—¶å€™ï¼Œå†™ç¨‹åºçš„¼‹®ä¼šæœ‰çº¦æŸï¼Œä½†ä»Žç›´è§‰ä¸Šè¯´˜q™ç§¾U¦æŸä¸€å®šç¨‹åº¦ä¸Šæç¤ºäº†è®¾è®¡æˆ–实现上ä¸åˆç†çš„地æ–V€‚带ç€å¤–键写出æ¥çš„应用更們֑于严谨。äñ”å“上¾U¿ä¹‹å‰å¦‚果确实需è¦é€šè¿‡ç‰ºç‰²å¤–键辑ֈ°æ€§èƒ½ä¸Šçš„优化åQŒå†æ¡ç›¸å¯¹ä¸é‡è¦çš„外键废弃掉åQŒåŒæ—¶è¦æŠŠè¿™ä¸ªdocument下æ¥åQŒä¸‹‹Æ¡é‡åˆ°æ•°æ®ä¸ä¸€è‡´é—®é¢˜çš„æ—¶å€™ï¼Œæ˜¯ä¸ª¾U¿çƒ¦ã€‚两点说明:1. 我们在åšçš„一个项目确实是ž®é¡¹ç›®ã€?nbsp; 2. 我得承认我最˜q‘三òq´å¼€å‘都ä¸ç”¨å…³ç³»åž‹æ•°æ®åº“åQŒè²Œä¼?no sql那么nbçš„key-value pairå˜æ•°æ®ï¼Œå…¶å®ž˜q™ä¸‰òq´åœ¨æŒä¹…层上很多¾U 结。如果我说的ä¸å¯¹åQŒè¯·æŒ‡æ£åQ?/u>
下é¢å¼•用一些有è§åœ°çš„æƒ³æ³•:
× æ”¯æŒå¤–键的:
1. ä½ çš„½E‹åºå†ä¸¥è°¨ä¹Ÿæœ‰å¯èƒ½å‡ºçްBUG;ä½ è‡ªå·±åˆ¤æ–ä¸å¦‚交¾l™æ•°æ®åº“判æ–åQŒå®ƒåšå¾—åˆå¿«åˆå¥½ã€?br> 大多æ•îChçš„ç¨‹åºæ²¡æœ‰è€ƒè™‘òq¶å‘é—®é¢˜ã€‚ä¸€æ—¦è€ƒè™‘äº†å°±å¾—æ‰‹å·¥åŠ é”,效率很低ã€?br> æ•°æ®å¯èƒ½¾l•è¿‡ä½ çš„åº”ç”¨½E‹åº˜q›å…¥æ•°æ®åº“ã€?br>2. 性能问题åQšéš¾é“ä½ è‡ªå·±åšå°±æ²¡æœ‰å¼€é”€åQ?br> 一个外键判æ–分摊到事务¾U§åˆ«åQŒå¼€é”€å¯ä»¥å¿½ç•¥åQŒç”¨æˆ·å®Œå…¨æ²¡æœ‰å¯Ÿè§‰ã€?br> 如果是批é‡å¯¼å…¥æ•°æ®ï¼Œå¯ä»¥å…ˆæš‚æ—¶å±è”½å¤–键,事åŽç”¨NOVALIDATE选项快速æ¢å¤ï¼Œå‰ææ˜¯ä½ çš„æ•°æ®æ˜¯òq²å‡€çš„ã€?
也有人æåˆîCº†å¦‚æžœ100å¼ è¡¨å¯èƒ½éœ€è¦å¾ç«?00个约æŸï¼Œå¯ÆD‡´æ€§èƒ½å¤ªå·®ã€?br>我è¦è¯´çš„ä»ç„¶æ˜¯ï¼Œæ˜¯å¦˜q?00个外键约æŸéƒ½æ˜¯ä¸šåŠ¡å¿…™åÈš„åQŒå¦‚果是åQŒæ²¡æœ‰åŠžæ³•è¿™ž®±æ˜¯å¿…é¡»è¦åŠ çš„ï¼Œå¦‚æžœä¸æ˜¯åQŒé‚£ä¹ˆå¤§å¯ä¸å¿…åœ¨æ‰€æœ‰çš„åœ°æ–¹éƒ½å¢žåŠ å¤–é”®ã€?br>如果在程åºä¸ä»…对其ä¸çš?ã€?å¼ è¡¨çš?0æ¥ä¸ªå¤–é”®¾U¦æŸ˜q›è¡Œåˆ¤æ–åQŒç„¶åŽå’Œæ•°æ®åº“ä¸çš?00个外键去比较åQŒåƈ评ähOracle的外键性能太差åQŒææ€•是有失公å…çš„ã€?
× å对外键的:
的确外键在大¾pÈ»Ÿä¸ç”¨çš„很ž®‘,在开å‘刾U§ï¼Œè®¾è®¡æ•°æ®åº“çš„æ—¶å€™ä¸€èˆ¬ä¼šåŠ å…¥å¤–é”®åQŒä»¥ä¿è¯¾pÈ»Ÿè®¾è®¡çš„完整性和业务需求的完整性,也便于开å‘äh员了解业务规则,在程åºä¸åŠ ä»¥æŽ§åˆ¶åQŒå¾ˆå¤šå¤§¾pÈ»Ÿåœ¨ç³»¾lŸç¨³å®šåŽåQŒä¼šé€æ¥ž®†å¤–键去掉,以ä¿è¯æ€§èƒ½åQŒå°†å¤ªå¤šçš„åŠŸèƒ½å¼ºåŠ äºŽæ•°æ®åº“,虽然说数æ®åº“很强大,但是毕竟很多äºÞZ¸ä¿¡ä“Qæ•°æ®åº“的能强大到什么都能干的地æ¥ã€‚所以在一个大¾pÈ»Ÿä¸å¤–é”®è§çš„少也丑³äؓ奇,ž®ç³»¾lŸå°±æ— 所谓了åQŒç”¨ä¸ç”¨å¤–é”®å–决于设计äh员,˜q™æ ·çš„ç³»¾lŸä¹Ÿéšå¤„å¯è§ã€?
å¦å¼•用一½‹‡ï¼š
引自http://blog.csdn.net/neusoft_lkz/archive/2009/07/21/4366668.aspx
æ•°æ®åº“设计是å¦éœ€è¦å¤–键。这里有两个问题åQšä¸€ä¸ªæ˜¯å¦‚何ä¿è¯æ•°æ®åº“æ•°æ®çš„完整性和一致性;二是½W¬ä¸€æ¡å¯¹æ€§èƒ½çš„媄å“ã€?br>æ£æ–¹è§‚点åQ?br>1åQŒç”±æ•°æ®åº“自íw«ä¿è¯æ•°æ®ä¸€è‡´æ€§ï¼Œå®Œæ•´æ€§ï¼Œæ›´å¯é ï¼Œå› äØ“½E‹åºå¾ˆéš¾100åQ…ä¿è¯æ•°æ®çš„完整性,而用外键å³ä‹É在数æ®åº“æœåŠ¡å™¨å½“æœºæˆ–è€…å‡ºçŽ°å…¶ä»–é—®é¢˜çš„æ—¶å€™ï¼Œä¹Ÿèƒ½å¤Ÿæœ€å¤§é™åº¦çš„ä¿è¯æ•°æ®çš„一致性和完整性ã€?br>egåQšæ•°æ®åº“和应用是一对多的关¾p»ï¼ŒåQ¡åº”用会¾l´æŠ¤ä»–那部分数æ®çš„完整性,¾pÈ»Ÿä¸€å˜å¤§æ—Óž¼Œå¢žåŠ äº†ïð‡åº”用åQŒï¼¡å’Œïð‡ä¸¤ä¸ªåº”用也许是ä¸åŒçš„å¼€å‘团队æ¥åšçš„。他们如何åè°ƒä¿è¯æ•°æ®çš„完整性,而且一òq´ä»¥åŽå¦‚æžœåˆå¢žåŠ äº†C应用呢?
2åQŒæœ‰ä¸Õd¤–键的数æ®åº“设计å¯ä»¥å¢žåŠ ER囄¡š„å¯è¯»æ€§ï¼Œ˜q™ç‚¹åœ¨æ•°æ®åº“设计旉™žå¸”R‡è¦ã€?br>3åQŒå¤–键在一定程度上说明的业务逻辑åQŒä¼šä½¿è®¾è®¡å‘¨åˆ°å…·ä½“å…¨é¢ã€?br>åæ–¹è§‚点åQ?br>1åQŒå¯ä»¥ç”¨è§¦å‘器或应用½E‹åºä¿è¯æ•°æ®çš„完整æ€?br>2åQŒè¿‡åˆ†å¼ºè°ƒæˆ–者说使用主键åQ外键会òqÏx·»å¼€å‘éš¾åº¦ï¼Œå¯ÆD‡´è¡¨è¿‡å¤šç‰é—®é¢˜
3åQŒä¸ç”¨å¤–é”®æ—¶æ•°æ®½Ž¡ç†½Ž€å•,æ“作方便åQŒæ€§èƒ½é«˜ï¼ˆå¯¼å…¥å¯¼å‡º½{‰æ“作,在insert, update, delete æ•°æ®çš„æ—¶å€™æ›´å¿«ï¼‰
eg:在æ“vé‡çš„æ•°æ®åº“䏿ƒ³éƒ½ä¸è¦åŽÀLƒ³å¤–é”®åQŒè¯•惻I¼Œä¸€ä¸ªç¨‹åºæ¯å¤©è¦insert数百万æ¡è®°å½•åQŒå½“å˜åœ¨å¤–é”®¾U¦æŸçš„æ—¶å€™ï¼Œæ¯æ¬¡è¦åŽ»æ‰«ææ¤è®°å½•æ˜¯å¦åˆæ û|¼Œä¸€èˆ¬è¿˜ä¸æ¢ä¸€ä¸ªå—ŒD‰|œ‰å¤–é”®åQŒè¿™æ äh‰«æçš„æ•°é‡æ˜¯æˆ¾U§æ•°çš„å¢žé•¿ï¼æˆ‘的一个程åºå…¥åº“在3ä¸ªå°æ—¶åšå®Œï¼Œå¦‚æžœåŠ ä¸Šå¤–é”®åQŒéœ€è¦?8ä¸ªå°æ—Óž¼
¾l“论åQ?br>1åQŒåœ¨å¤§åž‹¾pÈ»Ÿä¸ï¼ˆæ€§èƒ½è¦æ±‚ä¸é«˜åQŒå®‰å…¨è¦æ±‚高åQ‰ï¼Œä½¿ç”¨å¤–é”®åQ›åœ¨å¤§åž‹¾pÈ»Ÿä¸ï¼ˆæ€§èƒ½è¦æ±‚高,安全自己控制åQ‰ï¼Œä¸ç”¨å¤–é”®åQ›å°¾pÈ»Ÿéšä¾¿åQŒæœ€å¥½ç”¨å¤–é”®ã€?br>2åQŒç”¨å¤–é”®è¦é€‚当åQŒä¸èƒ½è¿‡åˆ†è¿½æ±?br>3åQŒä¸ç”¨å¤–键而用½E‹åºæŽ§åˆ¶æ•°æ®ä¸€è‡´æ€§å’Œå®Œæ•´æ€§æ—¶åQŒåº”该写一层æ¥ä¿è¯åQŒç„¶åŽä¸ªä¸ªåº”用通过˜q™ä¸ªå±‚æ¥è®‰K—®æ•°æ®åº“ã€?
java developerå¸¸è§æ¡ˆå¤´ä¹?/p>
2. effective java, 2nd Edition
会写代ç 和写好代ç 的差è·åQŒå¯ä»¥é ˜q™æœ¬ä¹¦ç¾ƒçŸã€‚包å«JDK1.5çš„feature. 太出å了åQŒä¸å¤šè¯„论ã€?/p>
3. refactoring – improve the design of existing code
Martin Fowlerçš„ç»å…¸è‘—作之一。åˆçœ‹çš„æ—¶å€™ä¸€å¤´å†·æ±—,他指出的很多错误我也犯过ã€?/p>
4. J2EE Development Without EJB
Rod Johnson啿Œ‘EJBçš„æ€æƒ³åŸºæœ¬éƒ½åæ˜ åœ¨˜q™é‡Œ
作者ä»ç„¶æ˜¯Rod Johnson, 和上一本书是一个系列的好书åQŒåŒæ ïL»å…¸ã€?/p>
6. Domain Driven Design – Tackling Complexity In The Heart Of Software
˜q‘两òq´æ¥å¯¹è‡ªå·±åª„哿œ€å¤§çš„一本书。俺到处推广之ã€?/p>
7. Extreme programming explained – embrace change 2nd edition
½W¬ä¸€ç‰ˆå°±å¤‡å—推崇åQ?得了Jolt大奖åQŒè¿™æ˜¯Kent Beckåˆç»é”¤ç‚¼çš„第二版
8. Patterns of Enterprise Application Architecture
很多人都是通过˜q™æœ¬ä¹¦è®¤è¯†Martin大å”çš„å§åQ?哈哈åQŒåŽ»òq?0月我亲眼è§åˆ°äº†Martin FowleråQŒè¿˜é—®äº†é—®å…³äºŽè¿™æœ¬ä¹¦çš„问题ã€?/p>
è‡ªå·±æ˜¯é ˜q™æœ¬ä¹¦å…¥é—¨Springçš?/p>
10. Pro Spring
说实è¯ï¼Œ˜q™æœ¬ä¹¦åªæ˜¯ç®€å•ç¿»˜q‡ï¼Œè®²äº†ä¸€äº›ä¸Šä¸€æœ¬ä¹¦æ²¡cover到的东西。Amazon上评ä»ïL›¸å½“高
11. Java Persistence with Hibernate
å¦hibernateçš„ä¸äºŒä¹‹é€?/p>
Struts2˜q™ç§æŠ€æœ¯ä¸å¤ªé€‚åˆçœ‹ä¹¦å¦ï¼Œåº”该直接看例å?google, ˜q™æœ¬å¯ä»¥æ¡é‡ç‚¹çœ‹çœ‹ï¼Œç„¶åŽå½“工具书ä½Ñ€?/p>
@echo off
set errorlevel=0
set dump_command="C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqldump"
set db_bbs=bbscs8
set db_bug=jtrac
set db_wiki=wiki
set backup_dir=U:\bak\mysql\
set timestamp=%date:~,4%%date:~5,2%%date:~8,2%_%time:~0,2%-%time:~3,2%-%time:~6,2%
set backup_bbs_file=%backup_dir%%db_bbs%_backup_%timestamp%.sql
set backup_bug_file=%backup_dir%%db_bug%_backup_%timestamp%.sql
set backup_wiki_file=%backup_dir%%db_wiki%_backup_%timestamp%.sql
set user_mysql=root
set password_mysql=virtual
echo backup mysql database:%db_bbs%
%dump_command% -u%user_mysql% -p%password_mysql% %db_bbs% > %backup_bbs_file%
echo backup mysql database:%db_bug%
%dump_command% -u%user_mysql% -p%password_mysql% %db_bug% > %backup_bug_file%
echo backup mysql database:%db_wiki%
%dump_command% -u%user_mysql% -p%password_mysql% %db_wiki% > %backup_wiki_file%
echo end backup
VisualSVN Server----更方便ä‹É用的SVNæœåŠ¡å™?æ”¶è—
å‰å‘çŽîCº†ä¸€ä¸ªå¥½ç”¨çš„æœåŠ¡å™¨ç«¯è½¯äšgVisualSVN Server。下é¢å°±å…¶å®‰è£…åŠé…ç½®æ–ÒŽ³•作一½Ž€ç•¥ä»‹¾l:
1åQ?安装
˜q™é‡Œæˆ‘们下è²Windowsòq›_°ä¸‹çš„VisualSVN ServeråQŒåœ°å€åœ¨è¿™é‡Œï¼Œä¸‹è²åŽï¼ŒåŒå‡»å®‰è£…åQŒå¼¹å‡ÞZ¸‹é¢çš„å¯¹è¯æ¡†ï¼Œå¯ä»¥æ›´æ”¹Respositories仓库路径åQ?
2åQ‰ä‹É用VisualSVN Server Manager˜q›è¡Œé…ç½®
安装完毕åQŒé»˜è®¤ä¼šå¼¹å‡ºVisualSVN Server Manager½Ž¡ç†å™¨ï¼Œåœ¨ç®¡ç†å™¨ä¸çš„Repositories目录下å¯ä»¥åˆ›å»ºæˆ‘们将è¦ä¸Šä¼ æºç 的目录¾l“æž„åQŒå¦‚图所½Cºï¼Œ¾U¢æ¡†å†…是该目录在æœåŠ¡å™¨ä¸Šçš„http地å€åQ?
注æ„åQšåœ¨Resposiories下目录创å»ÞZ¹‹å‰ï¼Œé¦–å…ˆè¦åœ¨Usersç›®å½•åˆ›å¾æ‹¥æœ‰ä¸Šä¼ ä¸‹è²æƒé™çš„用户åŠå…¶å¯†ç (如:用户åQšmike, 密ç åQ?23åQ?
3åQ‰ä¸Šä¼ æºç ?
˜q™é‡Œæˆ‘们使用Eclipseçš„svnæ’äšgæ¥ä¸Šä¼ æºç ï¼Œé€‰ä¸æ‰€è¦ä¸Šä¼ 的工程åQŒå³é”®Team->Share ProjectåQŒå¼¹å‡ºå¯¹è¯æ¡†åQŒé€‰ä¸SVN™å¹ï¼Œ¾l§ç®‹åˆîC¸‹ä¸€™åµï¼Œå¦‚下囄¡¤ºåQ?
URLæ 填入目录æœåŠ¡å™¨çš„http地å€åQŒUseråŠPasswordæ å¡«å…¥mikeå’?23,˜q›å…¥ä¸‹ä¸€æ¥ï¼Œå¦‚有warningå¯¹è¯æ¡†å¼¹å‡ºï¼Œé€‰æ‹©"Trust Always"å›_¯åQŒsvnä»£ç æäº¤æ–ÒŽ³•ä¸åœ¨˜q™é‡Œèµ˜è¿°ã€‚æäº¤å®Œæ¯•,å›_¯çœ‹åˆ°Eclipse工程æºç 出现svnæœåŠ¡å™¨åœ°å€æˆ–版本å·ã€?