ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>成人精品网站在线观看,国内精品伊人久久久,免费理论片在线观看播放老http://www.aygfsteel.com/msmary/articles/153876.html谭明谭明Thu, 18 Oct 2007 06:08:00 GMThttp://www.aygfsteel.com/msmary/articles/153876.htmlhttp://www.aygfsteel.com/msmary/comments/153876.htmlhttp://www.aygfsteel.com/msmary/articles/153876.html#Feedback0http://www.aygfsteel.com/msmary/comments/commentRss/153876.htmlhttp://www.aygfsteel.com/msmary/services/trackbacks/153876.html计算æœ?/strong>¾~–程æ—Óž¼Œå½“æ—¶çš„è€å¸ˆž®±å‘Šè¯‰æˆ‘们说åQšè®¡½Ž—机½E‹åºåQæ•°æ®ç»“构+½Ž—法。尽½Ž¡çŽ°åœ¨çš„½E‹åºå¼€å‘已由é¢å‘过½E‹äØ“ä¸»é€æ­¥˜q‡æ¸¡åˆ°é¢å‘å¯¹è±¡äØ“ä¸»ï¼Œä½†æˆ‘˜q˜æ˜¯æ·±æ·±èµžåŒ8òq´å‰è€å¸ˆçš„告诉我们的公å¼åQšè®¡½Ž—机½E‹åºåQæ•°æ®ç»“构+½Ž—法。é¢å‘对象的½E‹åºå¼€å‘,è¦åšçš„第一件事ž®±æ˜¯åQŒå…ˆåˆ†æžæ•´ä¸ª½E‹åºä¸­éœ€å¤„ç†çš„æ•°æ®ï¼Œä»Žä¸­æå–出抽象模æ¿ï¼Œä»¥è¿™ä¸ªæŠ½è±¡æ¨¡æ¿è®¾è®¡ç±»åQŒå†åœ¨å…¶ä¸­é€æ­¥æ·ÕdР处ç†å…¶æ•°æ®çš„函数(å³ç®—æ³?åQŒæœ€åŽï¼Œå†ç»™¾cÖM¸­çš„æ•°æ®æˆå‘˜å’Œå‡½æ•°åˆ’分讉K—®æƒé™åQŒä»Žè€Œå®žçްå°è£…ã€?

  数æ®åº“的最åˆé›å½¢æ®è¯´æºè‡ªç¾Žå›½ä¸€ä¸ªå¥¶ç‰›åœºçš„记账薄(¾U¸è´¨çš„,由此å¯è§åQŒæ•°æ®åº“òq¶ä¸ä¸€å®šæ˜¯å­˜å‚¨åœ¨ç”µè„‘里的数æ®^_^)åQŒé‡Œé¢è®°å½•的是该奶牛场的收支账目åQŒç¨‹åºå‘˜åœ¨å°†å…¶æ•´ç†ã€å½•入到电脑中时从中å—到å¯å‘。当按照规定好的数殾l“构所采集到的数æ®é‡å¤§åˆîC¸€å®šç¨‹åº¦åŽåQŒå‡ºäºŽç¨‹åºæ‰§è¡Œæ•ˆçŽ‡çš„è€ƒè™‘åQŒç¨‹åºå‘˜ž®†å…¶ä¸­çš„‹‚€ç´¢ã€æ›´æ–°ç»´æŠ¤ç­‰åŠŸèƒ½åˆ†ç¦»å‡ºæ¥åQŒåšæˆå•独调用的模å—åQŒè¿™ä¸ªæ¨¡å—åŽæ¥å°±æ…¢æ…¢å‘å±•ã€æ¼”å˜æˆçŽ°åœ¨æˆ‘ä»¬æ‰€æŽ¥è§¦åˆ°çš„æ•°æ®åº?nobr>½Ž¡ç†¾pÈ»Ÿ(DBMS)——程åºå¼€å‘中的一个é‡è¦åˆ†æ”¯ã€?/p>

  下题q›å…¥æ­£é¢˜åQŒé¦–先按我个人所接触˜q‡çš„½E‹åº¾l™æ•°æ®åº“设计人员的功底分一下类åQ?br />   åQ‘ã€æ²¡æœ‰ç³»¾lŸå­¦ä¹ è¿‡æ•°æ®¾l“构的程åºå‘˜ã€‚è¿™¾cȨ‹åºå‘˜çš„作å“å¾€å¾€åªæ˜¯ä»–们的å³å…´çީ典P¼Œä»–们往往习惯åªè®¾è®¡æœ‰é™çš„几个表,实现æŸç±»åŠŸèƒ½çš„æ•°æ®å…¨éƒ¨å¡žåœ¨ä¸€ä¸ªè¡¨ä¸­ï¼Œå„表之间几乎毫无兌™”。网上丞®‘çš„å…è´¹½Ž¡ç†è½¯äšg都是˜q™æ ·çš„东西,当程åºåŠŸèƒ½æœ‰é™ï¼Œæ•°æ®é‡ä¸å¤šçš„æ—¶å€™ï¼Œå…¶ç¨‹åºè¿è¡Œè“væ¥æ²¡æœ‰ä»€ä¹ˆé—®é¢˜ï¼Œä½†æ˜¯å¦‚果用其½Ž¡ç†æ¯”较é‡è¦çš„æ•°æ®ï¼Œé£Žé™©æ€§éžå¸¸å¤§ã€?br />   åQ’ã€ç³»¾lŸå­¦ä¹ è¿‡æ•°æ®¾l“æž„åQŒä½†æ˜¯è¿˜æ²¡æœ‰å¼€å‘è¿‡å¯¹ç¨‹åºæ•ˆçŽ‡è¦æ±‚比较高的管ç†èÊYä»¶çš„½E‹åºå‘˜ã€‚è¿™¾cÖMh多åŠåˆšä»Žå­¦æ ¡æ¯•业ä¸ä¹…åQŒä»–们在设计数æ®åº“表¾l“æž„æ—Óž¼Œä¸¥æ ¼æŒ‰ç…§æ•™ç§‘书上的规定,æ­ÀL‰£E-R囑֒Œ3NF(别ç°å¿ƒï¼Œæ‰€æœ‰çš„æ•°æ®åº“设计高手都是从˜q™ä¸€æ­¥å¼€å§‹çš„)。他们的作å“åQŒå¯¹äºŽä¸€èˆ¬çš„access型轻é‡çñ”的管ç†èÊYä»Óž¼Œå·²ç»å¤Ÿç”¨ã€‚但是一旦该¾pÈ»Ÿéœ€è¦æ·»åŠ æ–°åŠŸèƒ½åQŒåŽŸæœ‰çš„æ•°æ®åº“表差ä¸å¤šå¾—˜q›è¡Œå¤§æ¢è¡€ã€?br />   åQ“ã€ç¬¬äºŒç±»½E‹åºå‘˜ï¼Œåœ¨ç»åŽ†è¿‡æ•°æ¬¡½E‹åºæ•ˆçŽ‡çš„æå‡ï¼Œä»¥åŠåŠŸèƒ½å‡çñ”的折腑֎åQŒç»ˆäºŽå‡¾U§æˆä¸ºæ•°æ®åº“设计的è€é¸ŸåQŒç¬¬ä¸€¾cȨ‹åºå‘˜çœég¸­çš„高人。这¾cȨ‹åºå‘˜å¯ä»¥èƒœä“Q二å个表以上的中型商业数æ®ç®¡ç†ç³»¾lŸçš„å¼€å‘工作。他们知é“该在什么样的情况下ä¿ç•™ä¸€å®šçš„å†—ä½™æ•°æ®æ¥æé«˜ç¨‹åºæ•ˆçŽ‡ï¼Œè€Œä¸”å…¶è®¾è®¡çš„æ•°æ®åº“坿‹“å±•æ€§è¾ƒå¥½ï¼Œå½“ç”¨æˆ·éœ€è¦æ·»åŠ æ–°åŠŸèƒ½æ—Óž¼ŒåŽŸæœ‰æ•°æ®åº“表åªéœ€åšå°‘é‡ä¿®æ”¹å³å¯ã€?br />   åQ”ã€åœ¨¾l历˜q‡ä¸Šå个¾cÖM¼¼æ•°æ®åº“管ç†èÊYä»¶çš„é‡å¤è®¾è®¡åŽï¼Œ½W¬ä¸‰¾cȨ‹åºå‘˜ä¸­åšæŒä¸‹æ¥æ²¡æœ‰è{行,而是希望从中扑ևº“åäh‡’”½H门的有心äh会慢慢觉悟,从而完æˆé‡å˜åˆ°è´¨å˜çš„è{æ¢ã€‚他们所设计的数æ®åº“表结构有一定的˜qœè§åQŒèƒ½å¤Ÿé¢„‹¹‹åˆ°æœªæ¥åŠŸèƒ½å‡çñ”所需è¦çš„æ•°æ®åQŒä»Žè€Œé¢„先留下伽W”。这¾cȨ‹åºå‘˜ç›®å‰å¤§å¤šæ™‹çñ”æˆæ•°æ®æŒ–掘方é¢çš„高çñ”软äšgå¼€å?/strong>人员ã€?br />   åQ•ã€ç¬¬ä¸‰ç±»½E‹åºå‘˜æˆ–½W¬å››¾cȨ‹åºå‘˜åQŒåœ¨å¯¹çŽ°æœ‰çš„å„å®¶æ•°æ®åº“管ç†ç³»¾lŸçš„原ç†å’Œå¼€å‘都有一定的é’È ”åŽï¼Œè¦ä¹ˆåœ¨å…¶åŸºç¡€ä¸Šè¿›è¡ŒäºŒ‹Æ¡å¼€å‘,è¦ä¹ˆè‡ªè¡Œå¼€å‘一套有自主版æƒçš„通用数æ®åº“管ç†ç³»¾lŸã€?/p>

  我个人正处于½W¬ä¸‰¾cÈš„末期åQŒæ‰€ä»¥ä¸‹é¢æ‰€åˆ—出的一些设计技巧åªé€‚刽W¬äºŒ¾cÕd’Œéƒ¨åˆ†½W¬ä¸‰¾cÀL•°æ®åº“è®¾è®¡äººå‘˜ã€‚åŒæ—Óž¼Œç”׃ºŽæˆ‘很ž®‘碰到有兴趣在这斚w¢æ·±é’»ä¸‹åŽ»çš„åŒè¡Œï¼Œæ‰€ä»¥æ–‡ä¸­éš¾å…å‡ºçŽ°é”™è¯¯å’Œé—æ¼åQŒåœ¨æ­¤å…ˆè¡Œå£°æ˜Žï¼Œ‹Æ¢è¿Žå¤§å®¶æŒ‡æ­£åQŒä¸è¦è—¿U哦8)

ã€€ã€€ä¸€ã€æ ‘型关¾pÈš„æ•°æ®è¡?br />   ä¸å°‘½E‹åºå‘˜åœ¨˜q›è¡Œæ•°æ®åº“设计的时候都é‡åˆ°˜q‡æ ‘型关¾pÈš„æ•°æ®åQŒä¾‹å¦‚常è§çš„¾cÕdˆ«è¡¨ï¼Œå³ä¸€ä¸ªå¤§¾c»ï¼Œä¸‹é¢æœ‰è‹¥òq²ä¸ªå­ç±»åQŒæŸäº›å­¾cÕdˆæœ‰å­¾c»è¿™æ ïLš„æƒ…况。当¾cÕdˆ«ä¸ç¡®å®šï¼Œç”¨æˆ·å¸Œæœ›å¯ä»¥åœ¨ä“Qæ„类别下æ·ÕdŠ æ–°çš„å­ç±»åQŒæˆ–者删除æŸä¸ªç±»åˆ«å’Œå…¶ä¸‹çš„æ‰€æœ‰å­¾c»ï¼Œè€Œä¸”预计以åŽå…¶æ•°é‡ä¼šé€æ­¥å¢žé•¿åQŒæ­¤æ—¶æˆ‘们就会考虑用一个数æ®è¡¨æ¥ä¿å­˜è¿™äº›æ•°æ®ã€‚按照教¿U‘书上的教导åQŒç¬¬äºŒç±»½E‹åºå‘˜å¤§æ¦‚ä¼šè®¾è®¡å‡ºç±»ä¼ÆD¿™æ ïLš„æ•°æ®è¡¨ç»“构:

¾cÕdˆ«è¡¨_1(Type_table_1)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg   说明
type_id               int                  æ— é‡å¤ã€€ã€€     ¾cÕdˆ«æ ‡è¯†åQŒä¸»é”?br /> type_name   char(50)           ä¸å…è®æ€Ø“½I?nbsp;  ¾cÕdž‹åç§°åQŒä¸å…许é‡å¤
type_father            int                  ä¸å…è®æ€Ø“½I?nbsp;  该类别的父类别标识,如果是顶节点的è¯è®‘Ö®šä¸ºæŸä¸ªå”¯ä¸€å€?/p>

  ˜q™æ ·çš„设计短ž®ç²¾æ‚,完全满èƒö3NFåQŒè€Œä¸”å¯ä»¥æ»¡èƒöç”¨æˆ·çš„æ‰€æœ‰è¦æ±‚ã€‚æ˜¯ä¸æ˜¯˜q™æ ·ž®Þp¡Œå‘¢ï¼Ÿ½{”案是NOåQWhyåQ?/p>

  我们æ¥ä¼°è®¡ä¸€ä¸‹ç”¨æˆ·å¸Œæœ›å¦‚何罗列出˜q™ä¸ªè¡¨çš„æ•°æ®çš„。对用户而言åQŒä»–当然期望按他所讑֮šçš„层‹Æ¡å…³¾pÖM¸€‹Æ¡ç½—列出所有的¾cÕdˆ«åQŒä¾‹å¦‚è¿™æ øP¼š
æ€È±»åˆ?br />   ¾cÕdˆ«1
    ¾cÕdˆ«1.1
      ¾cÕdˆ«1.1.1
    ¾cÕdˆ«1.2
  ¾cÕdˆ«2
    ¾cÕdˆ«2.1
  ¾cÕdˆ«3
    ¾cÕdˆ«3.1
    ¾cÕdˆ«3.2
  ……

  看看ä¸ÞZº†å®žçް˜q™æ ·çš„列表显½C?树的先åºé历)åQŒè¦å¯¹ä¸Šé¢çš„表进行多ž®‘次‹‚€ç´¢ï¼Ÿæ³¨æ„åQŒå°½½Ž¡ç±»åˆ?.1.1å¯èƒ½æ˜¯åœ¨¾cÕdˆ«3.2ä¹‹åŽæ·ÕdŠ çš„è®°å½•ï¼Œ½{”案ä»ç„¶æ˜¯N‹Æ¡ã€‚è¿™æ ïLš„æ•ˆçŽ‡å¯¹äºŽž®‘é‡çš„æ•°æ®æ²¡ä»€ä¹ˆåª„å“,但是日厾cÕdž‹æ‰©å……åˆ°æ•°åæ¡ç”šè‡³ä¸Šç™¾æ¡è®°å½•åŽåQŒå•å•列一‹Æ¡ç±»åž‹å°±è¦æ£€ç´¢æ•°å次该表åQŒæ•´ä¸ªç¨‹åºçš„˜q行效率ž®×ƒ¸æ•¢æ­¾l´äº†ã€‚或许第二类½E‹åºå‘˜ä¼šè¯ß_¼Œé‚£æˆ‘å†å¾ä¸€ä¸ªäÍæ—¶æ•°¾l„或临时表,专门ä¿å­˜¾cÕdž‹è¡¨çš„å…ˆåºé历¾l“æžœåQŒè¿™æ ·åªåœ¨ç¬¬ä¸€‹Æ¡è¿è¡Œæ—¶‹‚€ç´¢æ•°å次åQŒå†‹Æ¡ç½—列所有的¾cÕdž‹å…³ç³»æ—¶å°±ç›´æŽ¥è¯»é‚£ä¸ªäÍæ—¶æ•°¾l„或临时表就行了。其实,用ä¸ç€å†åŽ»åˆ†é…䏀嗿–°çš„内存æ¥ä¿å­˜˜q™äº›æ•°æ®åQŒåªè¦å¯¹æ•°æ®è¡¨è¿›è¡Œä¸€å®šçš„æ‰©å……åQŒå†å¯ÒŽ·»åŠ ç±»åž‹çš„æ•°é‡˜q›è¡Œä¸€ä¸‹çº¦æŸå°±è¡Œäº†åQŒè¦å®Œæˆä¸Šé¢çš„列表åªéœ€ä¸€‹Æ¡æ£€ç´¢å°±è¡Œäº†ã€‚䏋颿˜¯æ‰©å……åŽçš„æ•°æ®è¡¨ç»“构:

¾cÕdˆ«è¡¨_2(Type_table_2)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg                       说明
type_id                 int               æ— é‡å¤ã€€ã€€                   ¾cÕdˆ«æ ‡è¯†åQŒä¸»é”?br /> type_name      char(50)         ä¸å…è®æ€Ø“½I?nbsp;                  ¾cÕdž‹åç§°åQŒä¸å…许é‡å¤
type_father               int              ä¸å…è®æ€Ø“½I?nbsp;                  该类别的父类别标识,如果是顶节点的è¯è®‘Ö®šä¸ºæŸä¸ªå”¯ä¸€å€?br /> type_layer             char(6)     é™å®š3å±?åˆå§‹å€égØ“000000       ¾cÕdˆ«çš„å…ˆåºé历,主è¦ä¸ºå‡ž®‘检索数æ®åº“的次æ•?/p>

  按照˜q™æ ·çš„表¾l“æž„åQŒæˆ‘们æ¥çœ‹çœ‹ä¸Šé¢ä¾‹å­è®°å½•åœ¨è¡¨ä¸­çš„æ•°æ®æ˜¯æ€Žæ ·çš„:

type_id    type_name        type_father       type_layer
1              æ€È±»åˆ?nbsp;                 0                 000000
2               ¾cÕdˆ«1                   1                 010000
3              ¾cÕdˆ«1.1                 2                 010100
4              ¾cÕdˆ«1.2                 2                 010200
5              ¾cÕdˆ«2                    1                 020000
6              ¾cÕdˆ«2.1                 5                 020100
7              ¾cÕdˆ«3                    1                 030000
8              ¾cÕdˆ«3.1                 7                 030100
9              ¾cÕdˆ«3.2                 7                 030200
10            ¾cÕdˆ«1.1.1              3                 010101
……

  现在按type_layer的大ž®æ¥‹‚€ç´¢ä¸€ä¸‹ï¼šSELECT * FROM Type_table_2 ORDER BY type_layer

列出记录集如下:

type_id   type_name      type_father       type_layer
1             æ€È±»åˆ?nbsp;              0                 000000
2             ¾cÕdˆ«1                 1                 010000
3             ¾cÕdˆ«1.1              2                 010100
10           ¾cÕdˆ«1.1.1           3                 010101
4             ¾cÕdˆ«1.2              2                 010200
5             ¾cÕdˆ«2                 1                 020000
6             ¾cÕdˆ«2.1              5                 020100
7             ¾cÕdˆ«3                 1                 030000
8             ¾cÕdˆ«3.1              7                 030100
9             ¾cÕdˆ«3.2              7                 030200
……

ã€€ã€€çŽ°åœ¨åˆ—å‡ºçš„è®°å½•é¡ºåºæ­£å¥½æ˜¯å…ˆåºé历的结果。在控制昄¡¤º¾cÕdˆ«çš„层‹Æ¡æ—¶åQŒåªè¦å¯¹type_layerå­—æ®µä¸­çš„æ•°å€ÆD¿›è¡Œåˆ¤æ–­ï¼Œæ¯?ä½ä¸€¾l„,如大äº?则å‘å³ç§»2个空根{€‚当ç„Óž¼Œæˆ‘这个例å­ä¸­è®‘Ö®šçš„é™åˆ¶æ¡ä»¶æ˜¯æœ€å¤?层,æ¯å±‚最多å¯è®?9个孾cÕdˆ«åQŒåªè¦æŒ‰ç”¨æˆ·çš„需求情况修改一下type_layerçš„é•¿åº¦å’Œä½æ•°åQŒå³å¯æ›´æ”šw™åˆ¶å±‚æ•°å’Œå­ç±»åˆ«æ•°ã€‚其实,上é¢çš„设计ä¸å•å•åªåœ¨¾cÕdˆ«è¡¨ä¸­ç”¨åˆ°åQŒç½‘上æŸäº›å¯æŒ‰æ ‘型列表显½Cºçš„论国E‹åºå¤§å¤šé‡‡ç”¨¾cÖM¼¼çš„设计ã€?/p>

  或许有ähè®¤äØ“åQŒType_table_2中的type_father字段是冗余数æ®ï¼Œå¯ä»¥é™¤åŽ»ã€‚å¦‚æžœè¿™æ øP¼Œåœ¨æ’å…¥ã€åˆ é™¤æŸä¸ªç±»åˆ«çš„æ—¶å€™ï¼Œž®±å¾—对type_layer 的内容进行比较ç¹ç的判定åQŒæ‰€ä»¥æˆ‘òq¶æ²¡æœ‰æ¶ˆåŽ»type_father字段åQŒè¿™ä¹Ÿæ­£½W¦åˆæ•°æ®åº“设计中适当ä¿ç•™å†—余数æ®çš„æ¥é™ä½Ž½E‹åºå¤æ‚度的原则åQŒåŽé¢æˆ‘会ä‹D一个故æ„增加数æ®å†—余的案例ã€?/p>

  
  二ã€å•†å“ä¿¡æ¯è¡¨çš„设è®?br />   å‡è®¾ä½ æ˜¯ä¸€å®¶ç™¾è´§å…¬å¸ç”µè„‘部的开å‘äh员,æŸå¤©è€æ¿è¦æ±‚你䨓公å¸å¼€å‘一套网ä¸?nobr>电å­å•†åŠ¡òq›_°åQŒè¯¥ç™¾è´§å…¬å¸æœ‰æ•°åƒç§å•†å“出售åQŒä¸˜q‡ç›®å‰ä»…打算先在¾|‘上销售数åç§æ–¹ä¾¿˜q输的商å“,当然åQŒä»¥åŽå¯èƒ½ä¼šé™†ç®‹åœ¨è¯¥ç”µå­å•†åŠ¡òq›_°ä¸Šå¢žåŠ æ–°çš„å•†å“出售。现在开始进行该òq›_°æ•°æ®åº“的商å“ä¿¡æ¯è¡¨çš„设计。毿U出售的商å“都会有相åŒçš„属性,如商å“ç¼–åøP¼Œå•†å“åç§°åQŒå•†å“所属类别,相关信æ¯åQŒä¾›è´§åŽ‚å•†ï¼Œå†…å«ä»¶æ•°åQŒåº“存,˜q›è´§ä»øP¼Œé”€å”®ä­håQŒä¼˜æƒ ä­h。你很快ž®Þp®¾è®¡å‡º4个表åQšå•†å“类型表(Wares_type)åQŒä¾›è´§åŽ‚å•†è¡¨(Wares_provider)åQŒå•†å“ä¿¡æ¯è¡¨(Wares_info)åQ?/p>

商哾cÕdž‹è¡?Wares_type)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg                       说明
type_id                 int               æ— é‡å¤ã€€ã€€                   ¾cÕdˆ«æ ‡è¯†åQŒä¸»é”?br /> type_name     char(50)          ä¸å…è®æ€Ø“½I?nbsp;                  ¾cÕdž‹åç§°åQŒä¸å…许é‡å¤
type_father              int                ä¸å…è®æ€Ø“½I?nbsp;                  该类别的父类别标识,如果是顶节点的è¯è®‘Ö®šä¸ºæŸä¸ªå”¯ä¸€å€?br /> type_layer            char(6)     é™å®š3å±?åˆå§‹å€égØ“000000       ¾cÕdˆ«çš„å…ˆåºé历,主è¦ä¸ºå‡ž®‘检索数æ®åº“的次æ•?/p>

供货厂商�Wares_provider)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg                       说明
provider_id            int                  æ— é‡å¤ã€€ã€€                   供货商标识,主键
provider_name   char(100)          ä¸å…è®æ€Ø“½I?nbsp;                          供货商å¿U?/p>

商å“ä¿¡æ¯è¡?Wares_info)
å称      ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg                       说明
wares_id              int                æ— é‡å¤ã€€ã€€                  å•†å“标识åQŒä¸»é”?br /> wares_name     char(100)         ä¸å…è®æ€Ø“½I?nbsp;                   å•†å“åç§°
wares_type   int                 ä¸å…è®æ€Ø“½Iºã€€ã€€ã€€ã€€    商哾cÕdž‹æ ‡è¯†åQŒå’ŒWares_type.type_idå…Œ™”
wares_info        char(200)        å…许为空                         相关信æ¯
provider              int                  ä¸å…è®æ€Ø“½I?nbsp;                   ä¾›è´§åŽ‚å•†æ ‡è¯†åQŒå’ŒWares_provider.provider_idå…Œ™”
setnum                int                  åˆå§‹å€égØ“1                      内å«ä»¶æ•°åQŒé»˜è®¤äØ“1
stock                  int                  åˆå§‹å€égØ“0                      库存åQŒé»˜è®¤äØ“0
buy_price         money              ä¸å…è®æ€Ø“½I?nbsp;                   ˜q›è´§ä»?br /> sell_price          money              ä¸å…è®æ€Ø“½I?nbsp;                   é”€å”®ä­h
discount            money              ä¸å…è®æ€Ø“½I?nbsp;                   ä¼˜æƒ ä»?/p>

  你拿瀘q?个表¾l™è€æ¿‹‚€æŸ¥ï¼Œè€æ¿å¸Œæœ›èƒ½å¤Ÿå†æ·»åŠ ä¸€ä¸ªå•†å“图片的字段åQŒä¸˜q‡åªæœ‰ä¸€éƒ¨åˆ†å•†å“有图片。OKåQŒä½ åœ¨å•†å“ä¿¡æ¯è¡¨(Wares_info)中增加了一个haspicçš„BOOL型字ŒDµï¼Œç„¶åŽå†å¾äº†ä¸€ä¸ªæ–°è¡¨â€”—商å“图片表(Wares_pic)åQ?/p>

商å“囄¡‰‡è¡?Wares_pic)
å称      ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg                       说明
pic_id                   int                æ— é‡å¤ã€€ã€€                  å•†å“囄¡‰‡æ ‡è¯†åQŒä¸»é”?br /> wares_id              int                 ä¸å…è®æ€Ø“½I?nbsp;                   æ‰€å±žå•†å“标识,和Wares_info.wares_idå…Œ™”
pic_address  char(200)         ä¸å…è®æ€Ø“½Iºã€€ã€€ã€€ã€€          囄¡‰‡å­˜æ”¾è·¯å¾„

  ½E‹åºå¼€å‘完æˆåŽåQŒå®Œå…¨æ»¡­‘Œ™€æ¿ç›®å‰çš„è¦æ±‚,于是正å¼å¯ç”¨ã€‚一ŒD‰|—¶é—´åŽåQŒè€æ¿æ‰“算在这套åã^åîC¸ŠæŽ¨å‡ºæ–°çš„商å“销售,其中åQŒæŸ¾cÕd•†å“全部都需æ·ÕdŠ “长度”的属性。第一轮折腾æ¥äº?#8230;…当然åQŒä½ æŒ‰ç…§æ·ÕdР商å“囄¡‰‡è¡¨çš„è€æ–¹æ³•,在商å“ä¿¡æ¯è¡¨(Wares_info)中增加了一个haslengthçš„BOOL型字ŒDµï¼Œåˆå¾äº†ä¸€ä¸ªæ–°è¡¨â€”—商å“长度表(Wares_length)åQ?/p>

商å“长度è¡?Wares_length)
å称      ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg                       说明
length_id              int                 æ— é‡å¤ã€€ã€€                     商å“囄¡‰‡æ ‡è¯†åQŒä¸»é”?br /> wares_id              int                 ä¸å…è®æ€Ø“½I?nbsp;                     æ‰€å±žå•†å“标识,和Wares_info.wares_idå…Œ™”
length             char(20)           ä¸å…è®æ€Ø“½Iºã€€ã€€ã€€ã€€ã€€ã€€å•†å“长度说明

ã€€ã€€åˆšåˆšæ”¹å®Œæ²¡å¤šä¹…ï¼Œè€æ¿åˆæ‰“½Ž—上一æ‰ÒŽ–°çš„商å“,˜q™æ¬¡æŸç±»å•†å“å…¨éƒ¨éœ€è¦æ·»åŠ?#8220;宽度”的属性。你咬了咬牙åQŒåˆç…§æ–¹æŠ“è¯åQŒæ·»åŠ äº†å•†å“宽度è¡?Wares_width)。刘q‡äº†ä¸€ŒD‰|—¶é—ß_¼Œè€æ¿æ–îC¸Šçš„商å“ä¸­æœ‰ä¸€äº›éœ€è¦æ·»åŠ?#8220;高度”çš„å±žæ€§ï¼Œä½ æ˜¯ä¸æ˜¯å¼€å§‹è§‰å¾—你所设计的数æ®åº“按照˜q™ç§æ–¹å¼å¢žé•¿ä¸‹åŽ»åQŒå¾ˆå¿«å°±èƒ½å˜æˆä¸€ä¸ªè¿·å®«å‘¢åQŸé‚£ä¹ˆï¼Œæœ‰æ²¡æœ‰ä»€ä¹ˆåŠžæ³•é制这¿Uä¸å¯é¢„è§æ€§ï¼Œä½†å´¾cÖM¼¼é‡å¤çš„æ•°æ®åº“è†¨èƒ€å‘¢ï¼Ÿæˆ‘åœ¨é˜…è¯»ã€Šæ•æ¯‚ÊYä»¶å¼€å‘ï¼šåŽŸåˆ™ã€æ¨¡å¼ä¸Žå®žè·µã€‹ä¸­å‘现作者ä‹D˜q‡ç±»ä¼¼çš„例å­åQ?.3 “Copy”½E‹åºã€‚其中,我éžå¸¸èµžåŒæ•毂ÊYä»¶å¼€å‘这个观点:在最åˆå‡ ä¹Žä¸˜q›è¡Œé¢„先设计åQŒä½†æ˜¯ä¸€æ—¦éœ€æ±‚å‘生å˜åŒ–ï¼Œæ­¤æ—¶ä½œäØ“ä¸€å追求哭‘Šçš„½E‹åºå‘˜ï¼Œåº”该从头审查整个架构设计åQŒåœ¨æ­¤æ¬¡ä¿®æ”¹ä¸­è®¾è®¡å‡ºèƒ½å¤Ÿæ»¡èƒö日厾cÖM¼¼ä¿®æ”¹çš„ç³»¾lŸæž¶æž„ã€‚ä¸‹é¢æ˜¯æˆ‘åœ¨éœ€è¦æ·»åŠ?#8220;长度”的属性时所æä¾›çš„ä¿®æ”ÒŽ–¹æ¡ˆï¼š

  åŽÀLމ商å“ä¿¡æ¯è¡?Wares_info)中的haspic字段åQŒæ·»åР商å“é¢å¤–属性表(Wares_ex_property)和商å“é¢å¤–ä¿¡æ¯è¡¨(Wares_ex_info)2个表æ¥å®Œæˆæ·»åŠ æ–°å±žæ€§çš„åŠŸèƒ½ã€?/p>

商å“é¢å¤–属性表(Wares_ex_property)
å称      ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg                       说明
ex_pid                  int                  æ— é‡å¤ã€€ã€€               å•†å“é¢å¤–属性标识,主键
p_name              char(20)            ä¸å…è®æ€Ø“½I?nbsp;                    é¢å¤–属性å¿U?/p>

商å“é¢å¤–ä¿¡æ¯è¡?Wares_ex_info)
å称        ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg                       说明
ex_iid                     int        æ— é‡å¤ã€€ã€€                     商å“é¢å¤–ä¿¡æ¯æ ‡è¯†åQŒä¸»é”?br /> wares_id                int         ä¸å…è®æ€Ø“½I?nbsp;                    æ‰€å±žå•†å“æ ‡è¯†ï¼Œå’ŒWares_info.wares_idå…Œ™”
property_id         int         ä¸å…è®æ€Ø“½Iºã€€ã€€  商å“é¢å¤–属性标识,和Wares_ex_property.ex_pidå…Œ™”
property_value  char(200)   ä¸å…è®æ€Ø“½I?nbsp;                       商å“é¢å¤–属性å€?/p>

  在商å“é¢å¤–属性表(Wares_ex_property)中添åŠ?æ¡è®°å½•:
ex_pid            p_name
1                商å“囄¡‰‡
2                商å“长度

  å†åœ¨æ•´ä¸ªç”µå­å•†åŠ¡òq›_°çš„åŽå°ç®¡ç†åŠŸèƒ½ä¸­˜q½åР䏀™å¹å•†å“é¢å¤–属性管ç†çš„功能åQŒä»¥åŽæ·»åŠ æ–°çš„å•†å“æ—¶å‡ºçŽ°æ–°çš„å±žæ€§ï¼Œåªéœ€åˆ©ç”¨è¯¥åŠŸèƒ½å¾€å•†å“é¢å¤–属性表(Wares_ex_property)中添加一æ¡è®°å½•å³å¯ã€‚ä¸è¦å®³æ€•å˜åŒ–,被第一颗å­å¼¹å‡»ä¸­åÆˆä¸æ˜¯å事åQŒå的是被相åŒè½¨é“飞æ¥çš„½W¬äºŒé¢—ã€ç¬¬ä¸‰é¢—å­å¼¹å‡ÖM¸­ã€‚第一颗å­å¼ÒŽ¥å¾—è¶Šæ—©ï¼Œæ‰€å—的伤越é‡ï¼Œä¹‹åŽçš„æŠµæŠ—力也越å¼?)

三ã€å¤šç”¨æˆ·åŠå…¶æƒé™½Ž¡ç†çš?nobr>设计
  开å?nobr>æ•°æ®åº?/strong>½Ž¡ç†¾cÈš„软äšgåQŒä¸å¯èƒ½ä¸è€ƒè™‘多用户和用户æƒé™è®„¡½®çš„问题。尽½Ž¡ç›®å‰å¸‚é¢ä¸Šçš„大ã€ä¸­åž‹çš„åŽå°æ•°æ®åº“ç³»¾lŸèÊY仉™ƒ½æä¾›äº†å¤šç”¨æˆ·åQŒä»¥åŠç»†è‡ÏxŸä¸ªæ•°æ®åº“内æŸå¼ è¡¨çš„æƒé™è®¾¾|®çš„功能åQŒæˆ‘个äh廸™®®åQšä¸€å¥—æˆç†Ÿçš„æ•°æ®åº“管ç†èÊYä»Óž¼Œ˜q˜æ˜¯åº”该自行设计用户½Ž¡ç†˜q™å—功能åQŒåŽŸå› æœ‰äºŒï¼š
  1.那些大ã€ä¸­åž‹åŽå°æ•°æ®åº“¾pÈ»Ÿè½¯äšg所æä¾›çš„多用户åŠå…¶æƒé™è®„¡½®éƒ½æ˜¯é’ˆå¯¹æ•°æ®åº“的共有属性,òq¶ä¸ä¸€å®šèƒ½å®Œå…¨æ»¡èƒöæŸäº›ç‰¹ä¾‹çš„需求;
  2.ä¸è¦˜q‡å¤šçš„ä¾èµ–åŽå°æ•°æ®åº“¾pÈ»Ÿè½¯äšgçš„æŸäº›ç‰¹ŒDŠåŠŸèƒ½ï¼Œå¤šç§å¤§ã€ä¸­åž‹åŽå°æ•°æ®åº“¾pÈ»Ÿè½¯äšg之间òq¶ä¸å®Œå…¨å…¼å®¹ã€‚å¦åˆ™ä¸€æ—¦æ—¥åŽéœ€è¦è{æ¢æ•°æ®åº“òq›_°æˆ–åŽå°æ•°æ®åº“¾pÈ»Ÿè½¯äšg版本å‡çñ”åQŒä¹‹å‰çš„æž¶æž„设计很å¯èƒ½æ— æ³•é‡ç”¨ã€?

  下é¢çœ‹çœ‹å¦‚何自行设计一套比较絋zÈš„多用æˆïL®¡ç†æ¨¡å—,匙¯¥æ•°æ®åº“管ç†èÊYä»¶çš„¾pÈ»Ÿ½Ž¡ç†å‘˜å¯ä»¥è‡ªè¡Œæ·»åŠ æ–°ç”¨æˆ·åQŒä¿®æ”¹å·²æœ‰ç”¨æˆïLš„æƒé™åQŒåˆ é™¤å·²æœ‰ç”¨æˆ—÷€‚首先,分æžç”¨æˆ·éœ€æ±‚,列出该数æ®åº“½Ž¡ç†è½¯äšg所有需è¦å®žçŽ°çš„åŠŸèƒ½åQ›ç„¶åŽï¼Œæ ÒŽ®ä¸€å®šçš„è”系对这些功能进行分¾c»ï¼ŒåÏxŠŠæŸç±»ç”¨æˆ·éœ€ä½¿ç”¨çš„功能归ä¸ÞZ¸€¾c»ï¼›æœ€åŽå¼€å§‹å¾è¡¨ï¼š
  
功能�Function_table)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg   说明
f_id                        int                 æ— é‡å¤ã€€ã€€   功能标识åQŒä¸»é”?br /> f_name                 char(20)         ä¸å…è®æ€Ø“½I?nbsp;  功能åç§°åQŒä¸å…许é‡å¤
f_desc                  char(50)            å…许为空         åŠŸèƒ½æè¿°

用户¾l„表(User_group)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg   说明
group_id                 int                    æ— é‡å¤?nbsp;       用户¾l„标识,主键
group_name         char(20)          ä¸å…è®æ€Ø“½I?nbsp;   用户¾l„å¿U?br /> group_power        char(100)       ä¸å…è®æ€Ø“½I?nbsp;   用户¾l„æƒé™è¡¨åQŒå†…å®¹äØ“åŠŸèƒ½è¡¨f_id的集å?/p>

用户�User_table)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg            说明
user_id                   int                    æ— é‡å¤?nbsp;               ç”¨æˆ·æ ‡è¯†åQŒä¸»é”?br /> user_name           char(20)             æ— é‡å¤?nbsp;                    用户å?br /> user_pwd            char(20)          ä¸å…è®æ€Ø“½I?nbsp;             用户密ç 
user_type               int                ä¸å…è®æ€Ø“½I?nbsp;         æ‰€å±žç”¨æˆïL»„标识åQŒå’ŒUser_group.group_idå…Œ™”

  采用˜q™ç§ç”¨æˆ·¾l„的架构设计åQŒå½“éœ€è¦æ·»åŠ æ–°ç”¨æˆ·æ—Óž¼Œåªéœ€æŒ‡å®šæ–°ç”¨æˆäh‰€å±žçš„用户¾l„;当以åŽç³»¾lŸéœ€è¦æ·»åŠ æ–°åŠŸèƒ½æˆ–å¯¹æ—§æœ‰åŠŸèƒ½æƒé™˜q›è¡Œä¿®æ”¹æ—Óž¼Œåªç”¨æ“作功能表和用户¾l„表的记录,原有用户的功能å³å¯ç›¸åº”éšä¹‹å˜åŒ–。当ç„Óž¼Œ˜q™ç§æž¶æž„设计把数æ®åº“½Ž¡ç†è½¯äšg的功能判定移åˆîCº†å‰å°åQŒä‹Éå¾—å‰å°å¼€å‘ç›¸å¯¹å¤æ‚一些。但是,当用æˆäh•°è¾ƒå¤§(10äºÞZ»¥ä¸?åQŒæˆ–æ—¥åŽè½¯äšgå‡çñ”的概率较大时åQŒè¿™ä¸ªä»£ä»äh˜¯å€¼å¾—çš„ã€?/p>


  四ã€ç®€‹z的扚w‡m:n设计
  ¼„°åˆ°m:n的关¾p»ï¼Œä¸€èˆ¬éƒ½æ˜¯å¾ç«?个表åQŒm一个,n一个,m:n一个。但是,m:n有时会é‡åˆ°æ‰¹é‡å¤„ç†çš„æƒ…况åQŒä¾‹å¦‚到图书馆借书åQŒä¸€èˆ¬éƒ½æ˜¯å…è®¸ç”¨æˆ·åŒæ—¶å€Ÿé˜…n本书åQŒå¦‚æžœè¦æ±‚按æ‰ÒŽŸ¥è¯¢å€Ÿé˜…记录åQŒå³åˆ—出æŸä¸ªç”¨æˆ·æŸæ¬¡å€Ÿé˜…的所有书¾c,该如何设计呢åQŸè®©æˆ‘们建好必须çš?个表先:

书ç±è¡?Book_table)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg   说明
book_id                 int                    æ— é‡å¤?nbsp;         ä¹¦ç±æ ‡è¯†åQŒä¸»é”?br /> book_no             char(20)             æ— é‡å¤?nbsp;          书籾~–å·
book_name         char(100)         ä¸å…è®æ€Ø“½I?nbsp;    书ç±åç§°
……

借阅用户�Renter_table)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg   说明
renter_id                int                     æ— é‡å¤?nbsp;       用户标识åQŒä¸»é”?br /> renter_name       char(20)           ä¸å…è®æ€Ø“½I?nbsp;      用户姓å
……

借阅记录�Rent_log)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg     说明
rent_id                   int                      æ— é‡å¤?nbsp;         借阅记录标识åQŒä¸»é”?br /> r_id                       int                  ä¸å…è®æ€Ø“½I?nbsp;   用户标识åQŒå’ŒRenter_table.renter_idå…Œ™”
b_id                      int                  ä¸å…è®æ€Ø“½I?nbsp;   ä¹¦ç±æ ‡è¯†åQŒå’ŒBook_table.book_idå…Œ™”
rent_date           datetime            ä¸å…è®æ€Ø“½I?nbsp;          借阅旉™—´
……

  ä¸ÞZº†å®žçŽ°æŒ‰æ‰¹æŸ¥è¯¢å€Ÿé˜…è®°å½•åQŒæˆ‘们å¯ä»¥å†å»ÞZ¸€ä¸ªè¡¨æ¥ä¿å­˜æ‰¹é‡å€Ÿé˜…的信æ¯ï¼Œä¾‹å¦‚åQ?/p>

扚w‡å€Ÿé˜…è¡?Batch_rent)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg      说明
batch_id                 int                    æ— é‡å¤?nbsp;         扚w‡å€Ÿé˜…标识åQŒä¸»é”?br /> batch_no                int                  ä¸å…è®æ€Ø“½I?nbsp;   扚w‡å€Ÿé˜…¾~–å·åQŒåŒä¸€æ‰¹å€Ÿé˜…çš„batch_no相åŒ
rent_id                   int                  ä¸å…è®æ€Ø“½I?nbsp;   借阅记录标识åQŒå’ŒRent_log.rent_idå…Œ™”
batch_date          datetime            ä¸å…è®æ€Ø“½I?nbsp;   扚w‡å€Ÿé˜…æ—‰™—´

  ˜q™æ ·çš„设计好å—?我们æ¥çœ‹çœ‹äؓ了列出æŸä¸ªç”¨æˆähŸ‹Æ¡å€Ÿé˜…的所有书¾c,需è¦å¦‚何查询?首先‹‚€ç´¢æ‰¹é‡å€Ÿé˜…è¡?Batch_rent)åQŒæŠŠ½W¦åˆæ¡äšg的的所有记录的rent_id字段的数æ®ä¿å­˜è“væ¥ï¼Œå†ç”¨˜q™äº›æ•°æ®ä½œäؓ查询æ¡äšg带入到借阅记录è¡?Rent_log)中去查询。那么,有没有什么办法改˜q›å‘¢åQŸä¸‹é¢ç»™å‡ÞZ¸€¿U简‹z的扚w‡è®¾è®¡æ–ÒŽ¡ˆåQŒä¸éœ€æ·ÕdŠ æ–°è¡¨åQŒåªéœ€ä¿®æ”¹ä¸€ä¸‹å€Ÿé˜…记录è¡?Rent_log)å›_¯ã€‚修改åŽçš„记录表(Rent_log)如下åQ?/p>

借阅记录�Rent_log)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg   说明
rent_id                  int         æ— é‡å¤?nbsp;       借阅记录标识åQŒä¸»é”?br /> r_id                       int         ä¸å…è®æ€Ø“½I?nbsp;   用户标识åQŒå’ŒRenter_table.renter_idå…Œ™”
b_id                      int         ä¸å…è®æ€Ø“½I?nbsp;   ä¹¦ç±æ ‡è¯†åQŒå’ŒBook_table.book_idå…Œ™”
batch_no               int         ä¸å…è®æ€Ø“½I?nbsp;   扚w‡å€Ÿé˜…¾~–å·åQŒåŒä¸€æ‰¹å€Ÿé˜…çš„batch_no相åŒ
rent_date          datetime    ä¸å…è®æ€Ø“½I?nbsp;   借阅旉™—´
……

  其中åQŒåŒä¸€‹Æ¡å€Ÿé˜…çš„batch_no和该批第一æ¡å…¥åº“çš„rent_id相åŒã€‚ä‹D例:å‡è®¾å½“剿œ€å¤§rent_idæ˜?4åQŒæŽ¥ç€æŸç”¨æˆ·ä¸€‹Æ¡å€Ÿé˜…äº?本书åQŒåˆ™æ‰šw‡æ’å…¥çš?æ¡å€Ÿé˜…记录的batch_no都是65。之åŽå¦å¤–一个用æˆïL§Ÿäº†ä¸€å¥—碟åQŒå†æ’入出租记录的rent_idæ˜?8。采用这¿U设计,查询扚w‡å€Ÿé˜…çš„ä¿¡æ¯æ—¶åQŒåªéœ€ä½¿ç”¨ä¸€æ¡æ ‡å‡†T_SQL的嵌套查询å³å¯ã€‚当ç„Óž¼Œ˜q™ç§è®¾è®¡ä¸ç¬¦å?NFåQŒä½†æ˜¯å’Œä¸Šé¢æ ‡å‡†çš?NF设计比è“væ¥ï¼Œå“ªä¸€¿U更好呢åQŸç­”案就ä¸ç”¨æˆ‘说了å§ã€?/p>


  五ã€å†—余数æ®çš„å–èˆ
  上篇çš?#8220;树型关系的数æ®è¡¨”中ä¿ç•™äº†ä¸€ä¸ªå†—余字ŒDµï¼Œ˜q™é‡Œçš„例孿›´˜q›ä¸€æ­¥â€”—添加了一个冗余表。先看看例å­åQšæˆ‘åŽŸå…ˆæ‰€åœ¨çš„å…¬å¸ä¸ÞZº†è§£å†³å‘˜å·¥çš„工作é¤åQŒå’Œé™„近的一家尘¡é¦†è”ç³»åQŒæ¯å¤©åƒé¥­è®°è´¦ï¼Œè´¹ç”¨æŒ‰ähæ•°åã^摊,月底由公å¸çŽ°é‡‘ç»“½Ž—,æ¯ä¸ªäººæ¯ä¸ªæœˆçš„工作é¤è´¹ä»Žå·¥èµ„中扣除。当ç„Óž¼Œæ¯å¤©åƒé¥­çš„ähå‘˜å’Œäººæ•°éƒ½ä¸æ˜¯å›ºå®šçš„åQŒè€Œä¸”åQŒç”±äºŽæ¯™å¿å·¥ä½œé¤çš„æ‰€ç‚¹çš„èœè‰²ä¸åŒåQŒæ¯™å¿çš„èŠÞp´¹ä¹Ÿä¸ç›¸åŒã€‚例如,星期一中é¤5äºø™Š±è´?0元,晚é¤2äºø™Š±è´?0åQŒæ˜ŸæœŸäºŒä¸­é¤6äºø™Š±è´?6元,晚é¤3äºø™Š±è´?8å…ƒã€‚äØ“äº†æ–¹ä¾¿è®¡½Ž—æ¯ä¸ªähæ¯ä¸ªæœˆçš„工作˜¡è´¹åQŒæˆ‘写了一个简陋的ž®±é¤è®°èÌŽ½Ž¡ç†½E‹åºåQŒæ•°æ®åº“里有3个表åQ?/p>

员工�Clerk_table)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg   说明
clerk_id                 int                      æ— é‡å¤?nbsp;         员工标识åQŒä¸»é”?br /> clerk_name         char(10)             ä¸å…è®æ€Ø“½I?nbsp;   员工姓å

æ¯é¤æ€»è¡¨(Eatdata1)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg   说明
totle_id                  int                     æ— é‡å¤?nbsp;        æ¯é¤æ€»è¡¨æ ‡è¯†åQŒä¸»é”?br /> persons               char(100)         ä¸å…è®æ€Ø“½I?nbsp;   ž®±é¤å‘˜å·¥çš„员工标识集å?br /> eat_date              datetime           ä¸å…è®æ€Ø“½I?nbsp;   ž®±é¤æ—¥æœŸ
eat_type              char(1)             ä¸å…è®æ€Ø“½I?nbsp;   ž®±é¤¾cÕdž‹åQŒç”¨æ¥åŒºåˆ†ä¸­ã€æ™š˜¡?br /> totle_price           money              ä¸å…è®æ€Ø“½I?nbsp;   æ¯é¤æ€»èбè´?br /> persons_num         int                  ä¸å…è®æ€Ø“½I?nbsp;    ž®±é¤äººæ•°

ž®±é¤è®¡è´¹¾l†è¡¨(Eatdata2)
å称     ¾cÕdž‹ã€€ã€€ã€€ã€€¾U¦æŸæ¡äšg   说明
id                           int                    æ— é‡å¤?nbsp;         ž®±é¤è®¡è´¹¾l†è¡¨æ ‡è¯†åQŒä¸»é”?br /> t_id                        int                  ä¸å…è®æ€Ø“½I?nbsp;   æ¯é¤æ€»è¡¨æ ‡è¯†åQŒå’ŒEatdata1.totle_idå…Œ™”
c_id                       int                  ä¸å…è®æ€Ø“½I?nbsp;   员工标识标识åQŒå’ŒClerk_table.clerk_idå…Œ™”
price                   money              ä¸å…è®æ€Ø“½I?nbsp;    æ¯ähæ¯é¤èŠÞp´¹

  其中åQŒå°±˜¡è®¡è´¹ç»†è¡?Eatdata2)的记录就是把æ¯é¤æ€»è¡¨(Eatdata1)的一æ¡è®°å½•按ž®±é¤å‘˜å·¥òqÏx‘Šæ‹†å¼€åQŒæ˜¯ä¸ªä¸æŠ˜ä¸æ‰£çš„冗余表。当ç„Óž¼Œä¹Ÿå¯ä»¥æŠŠæ¯é¤æ€»è¡¨(Eatdata1)的部分字ŒDµåˆòq¶åˆ°ž®±é¤è®¡è´¹¾l†è¡¨(Eatdata2)中,˜q™æ ·æ¯é¤æ€»è¡¨(Eatdata1)ž®±æˆäº†å†—余表åQŒä¸˜q‡è¿™æ äh‰€è®¾è®¡å‡ºæ¥çš„å°±˜¡è®¡è´¹ç»†è¡¨é‡å¤æ•°æ®æ›´å¤šï¼Œç›¸æ¯”æ¥è¯´˜q˜æ˜¯ä¸Šé¢çš„æ–¹æ¡ˆå¥½äº›ã€‚但是,ž®±æ˜¯ž®±é¤è®¡è´¹¾l†è¡¨(Eatdata2)˜q™ä¸ªå†—ä½™è¡¨ï¼Œåœ¨åšæ¯æœˆæ¯äh˜¡è´¹¾lŸè®¡çš„æ—¶å€™ï¼Œå¤§å¤§½Ž€åŒ–了¾~–ç¨‹çš„å¤æ‚度åQŒåªç”¨ç±»ä¼ÆD¿™ä¹ˆä¸€æ¡æŸ¥è¯¢è¯­å¥å³å¯ç»Ÿè®¡å‡ºæ¯ähæ¯æœˆçš„寄˜¡æ¬¡æ•°å’Œ˜¡è´¹æ€Õd¸åQ?/p>

SELECT clerk_name AS personname,COUNT(c_id) as eattimes,SUM(price) AS ptprice FROM Eatdata2 JOIN Clerk_tabsle ON (c_id=clerk_id) JOIN eatdata1 ON (totleid=tid) WHERE eat_date>=CONVERT(datetime,'"&the_date&"') AND eat_date<DATEADD(month,1,CONVERT(datetime,'"&the_date&"')) GROUP BY c_id

  惌™±¡ä¸€ä¸‹ï¼Œå¦‚æžœä¸ç”¨˜q™ä¸ªå†—ä½™è¡¨ï¼Œæ¯æ¬¡¾lŸè®¡æ¯ähæ¯æœˆçš„é¤è´ÒŽ€Õd¸æ—¶ä¼šå¤šéº»çƒ¦ï¼Œ½E‹åºæ•ˆçŽ‡ä¹Ÿå¤Ÿå‘›ã€‚é‚£ä¹ˆï¼Œåˆ°åº•ä»€ä¹ˆæ—¶å€™å¯ä»¥å¢žåŠ ä¸€å®šçš„å†—ä½™æ•°æ®å‘¢ï¼Ÿæˆ‘认为有2个原则:

  åQ‘ã€ç”¨æˆïLš„æ•´ä½“需求。当用户更多的关注于åQŒå¯¹æ•°æ®åº“的规范记录按一定的½Ž—法˜q›è¡Œå¤„ç†åŽï¼Œå†åˆ—出的数æ®ã€‚如果该½Ž—法å¯ä»¥ç›´æŽ¥åˆ©ç”¨åŽå°æ•°æ®åº“ç³»¾lŸçš„内嵌函数æ¥å®Œæˆï¼Œæ­¤æ—¶å¯ä»¥é€‚当的增加冗余字ŒDµï¼Œç”šè‡³å†—余表æ¥ä¿å­˜˜q™äº›¾l过½Ž—法处ç†åŽçš„æ•°æ®ã€‚è¦çŸ¥é“åQŒå¯¹äºŽå¤§æ‰šw‡æ•°æ®çš„æŸ¥è¯¢ï¼Œä¿®æ”¹æˆ–删除,åŽå°æ•°æ®åº“ç³»¾lŸçš„æ•ˆçއ˜qœè¿œé«˜äºŽæˆ‘们自己¾~–写的代ç ã€?br />   åQ’ã€ç®€åŒ–å¼€å‘çš„å¤æ‚度。现代èÊYä»¶å¼€å‘ï¼Œå®žçŽ°åŒæ ·çš„功能,æ–ÒŽ³•有很多。尽½Ž¡ä¸å¿…è¦æ±‚程åºå‘˜¾_ùN€šç»å¤§éƒ¨åˆ†çš„å¼€å‘工具和òq›_°åQŒä½†æ˜¯è¿˜æ˜¯éœ€è¦äº†è§£å“ª¿U方法æ­é…哪¿Uå¼€å‘å·¥å…ïLš„½E‹åºæ›´ç®€‹z,效率更高一些。冗余数æ®çš„æœ¬è´¨ž®±æ˜¯ç”¨ç©ºé—´æ¢æ—‰™—´åQŒå°¤å…¶æ˜¯ç›®å‰¼‹¬äšgçš„å‘展远˜qœé«˜äºŽèÊYä»Óž¼Œæ‰€ä»¥é€‚当的冗余是å¯ä»¥æŽ¥å—的。丘q‡æˆ‘˜q˜æ˜¯åœ¨æœ€åŽå†å¼ø™°ƒä¸€ä¸‹ï¼šä¸è¦˜q‡å¤šçš„ä¾èµ–åã^å°å’Œå¼€å‘å·¥å…ïLš„ç‰ÒŽ€§æ¥½Ž€åŒ–å¼€å‘,˜q™ä¸ªåº¦è¦æ˜¯æ²¡æŠŠæ¡å¥½çš„è¯ï¼ŒåŽæœŸ¾l´æŠ¤å‡çñ”会栽大跟头的ã€?/p>

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÄþÝõ| Ì©À´ÏØ| ÏçÄþÏØ| ÐËÎÄÏØ| È«ÄÏÏØ| Äϰ¶Çø| Ìì¶ëÏØ| ³çÀñÏØ| ɽÒõÏØ| Èô¶û¸ÇÏØ| ÌìµÈÏØ| ÕÑͨÊÐ| À­ÈøÊÐ| ³¤Ô«ÏØ| Á¬ÖÝÊÐ| Ïå³ÇÏØ| Î¼Ô´ÏØ| ÐÂÖñÊÐ| ÔóÆÕÏØ| Ð˹úÏØ| ÇàÆÖÇø| °¢¿ËÌÕÏØ| ÀúÊ·| ÃñÇÚÏØ| ʯÃÅÏØ| ÃÉÒõÏØ| нòÏØ| ÄÏ¿µÊÐ| ±±³½Çø| ¹óϪÊÐ| ¹ó¸ÛÊÐ| Äϲ¿ÏØ| ÄÏ»ªÏØ| ¸ñ¶ûľÊÐ| ·áÔ­ÊÐ| Õò°²ÏØ| Ïã¸ñÀïÀ­ÏØ| ÎÄÉ½ÏØ| ÍòÉ½ÌØÇø| Ìï¶«ÏØ| ïÃûÊÐ|