<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    春風(fēng)博客

    春天里,百花香...

    導(dǎo)航

    <2008年9月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    統(tǒng)計(jì)

    公告

    MAIL: junglesong@gmail.com
    MSN: junglesong_5@hotmail.com

    Locations of visitors to this page

    常用鏈接

    留言簿(11)

    隨筆分類(224)

    隨筆檔案(126)

    個(gè)人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    數(shù)據(jù)庫設(shè)計(jì)三范式應(yīng)用實(shí)戰(zhàn)

    數(shù)據(jù)庫設(shè)計(jì)三范式應(yīng)用實(shí)戰(zhàn)

    問題:如何將下表中列出的訂單信息存入到關(guān)系數(shù)據(jù)庫中
    客戶名                  總價(jià)值         商品列表
    北京商戶張三      1000元         上衣:20
    大連商戶李四      1500元         上衣:10;褲子:15;
    上海商戶王五      7500元         上衣:30;褲子:45;鞋子:60;

    粗略設(shè)計(jì)方案

    根據(jù)訂單上三欄內(nèi)容,擬用一個(gè)表來存儲(chǔ)訂單信息,此表稱為Order表,字段如下:
    Customer:可變字符型,用于存儲(chǔ)客戶地址姓名等信息。
    Total:數(shù)字類型,用于存儲(chǔ)一個(gè)訂單的總商品價(jià)值
    GoodsList:可變字符型,用于存儲(chǔ)商品名和商品數(shù)量

    這樣的設(shè)計(jì)是否符合數(shù)據(jù)庫設(shè)計(jì)三范式呢?可以一條條對(duì)照一下。

    數(shù)據(jù)庫設(shè)計(jì)三范式

    范式(Normal Form)共有五種,但第四和第五種難于實(shí)現(xiàn),并非必要。前三種標(biāo)準(zhǔn)格式為:
    第一范式(1NF)要求信息必須是原子級(jí)的,信息不可再分。
    第二范式(2NF)要求數(shù)據(jù)符合第一范式的標(biāo)準(zhǔn),另外數(shù)據(jù)元素被組織成組,消除了冗余的數(shù)據(jù)。每個(gè)組包含一個(gè)主鍵和非關(guān)鍵數(shù)據(jù),非關(guān)鍵數(shù)據(jù)必須在功能上依賴于主鍵。
    第三范式(3NF)要求數(shù)據(jù)元素符合第二范式的標(biāo)準(zhǔn),同時(shí)非關(guān)鍵數(shù)據(jù)不能包含依賴性。
    個(gè)人對(duì)其的總結(jié):1.信息不可分;2.以分組消除冗余數(shù)據(jù),組內(nèi)有主鍵作為唯一標(biāo)識(shí);3.組內(nèi)部的非主鍵數(shù)據(jù)不能相互依賴。

    現(xiàn)在來看看粗略設(shè)計(jì)方案是否符合數(shù)據(jù)庫設(shè)計(jì)三范式
    1.Customer和GoodsList列可分,不符合第一范式。
    2.無主鍵,且三大基本信息都不依賴于主鍵,沒有進(jìn)行合適分組,不符合第二范式。
    3.total列明顯依賴于GoodsList列,不符合第三范式。

    因?yàn)榇致栽O(shè)計(jì)方案不符合三大范式,我們有必要對(duì)其進(jìn)行修改。

    修改后的第二次設(shè)計(jì)方案

    首先為了滿足第一范式,將三大數(shù)據(jù)列細(xì)分如下:

    customerName:用于存儲(chǔ)客戶名稱
    customerAddress:用于存儲(chǔ)客戶地址
    total :用于存儲(chǔ)商品總價(jià)值
    Goods1:訂單商品一
    GoodsCount1:訂單商品一的數(shù)量
    Goods2:訂單商品二
    GoodsCount2:訂單商品二的數(shù)量
    Goods3:訂單商品三
    GoodsCount3:訂單商品三的數(shù)量

    到此,信息已經(jīng)不可再分,這樣的方案滿足了第一范式的要求。

    第二次設(shè)計(jì)方案存在的問題

    第二次設(shè)計(jì)方案雖然滿足了范式一,但是還有以下問題:
    1.三個(gè)訂單商品列和訂單數(shù)量列高度相似。
    2.如果客戶訂單商品類別確定在三種內(nèi)還可以,一旦超過只有再增加列,更麻煩的是商品類別數(shù)量不確定。
    3.各個(gè)字段作用差別很大,似乎不該放在同一張表的同一行中。

    上述問題說明第二次設(shè)計(jì)方案還有待改造,讓我們?cè)賮砜纯此欠窈虾醯诙?,三范式?/p>

    第二范式及解釋

    第二范式(2NF)要求數(shù)據(jù)符合第一范式的標(biāo)準(zhǔn),另外數(shù)據(jù)元素被組織成組,消除了冗余的數(shù)據(jù)。每個(gè)組包含一個(gè)主鍵和非關(guān)鍵數(shù)據(jù),非關(guān)鍵數(shù)據(jù)必須在功能上依賴于主鍵。
    上面這段話中,組實(shí)際上就是“數(shù)據(jù)表”的意思,第二范式告訴我們,應(yīng)該把數(shù)據(jù)元素按功能分開,分別存儲(chǔ)到不同表中,而且每個(gè)表都該含有一個(gè)主鍵,非關(guān)鍵列在功能上依賴于關(guān)鍵列。

    第三范式

    第三范式(3NF)要求數(shù)據(jù)元素符合第二范式的標(biāo)準(zhǔn),同時(shí)非關(guān)鍵數(shù)據(jù)不能包含依賴性。
    第二次設(shè)計(jì)方案中,總價(jià)值total是依賴于商品類別和商品數(shù)量的。我們必須取消這樣的非關(guān)鍵列之間的依賴性。
    通過觀察我們可以發(fā)現(xiàn),總價(jià)值=商品單價(jià)*商品數(shù)量的總和,這樣,總價(jià)值這一列就不需要存在了,直接計(jì)算得出即可。

    接下來形成了第三次設(shè)計(jì)方案

    訂單表orderTable
    id:主鍵,訂單流水id
    customerId:下訂單的客戶id,客戶表Id的外鍵

    訂單商品表ordergoods
    id:主鍵
    orderId:訂單表id的外鍵
    goodsId:商品表id的外鍵
    count:商品數(shù)量

    商品表goods:
    id:主鍵
    name:商品名
    price:?jiǎn)蝺r(jià)

    客戶表customer:
    id:主鍵
    name:客戶名
    address:客戶地址

    諸表建表語句

    create table customer(
       id 
    int(10primary key not null
       name 
    VARCHAR(255), 
       address 
    VARCHAR(255)


    create table goods(
       id 
    int(10primary key not null,  
       name 
    VARCHAR(255), 
       price 
    DOUBLE(10,2


    create table orderTable(
       id 
    int(10primary key not null,
       customerid 
    int(10not null,
       
    foreign key(customerid) references customer(id)
    )

    create table ordergoods(
       id 
    int(10primary key not null,
       orderid 
    int(10not null,
       goodsid 
    int(10not null,
       
    count  int(10),
       
    foreign key(orderid) references orderTable(id),
       
    foreign key(goodsid) references goods(id)
    )


    插值語句

    insert into customer ( id, name, address ) values ( '1''張三''北京' )
     
    insert into customer ( id, name, address ) values ( '2''李四''大連' )
     
    insert into customer ( id, name, address ) values ( '3''王五''上海' )

     
    insert into goods ( id, name, price ) values ( '11''上衣''240' )
     
    insert into goods ( id, name, price ) values ( '12''褲子''300' )
     
    insert into goods ( id, name, price ) values ( '13''鞋子''350' )

     
    insert into ordertable ( id, customerid ) values ( '111''1' )
     
    insert into ordertable ( id, customerid ) values ( '112''2' )
     
    insert into ordertable ( id, customerid ) values ( '113''3' )

     
    insert into ordergoods ( id, orderid, goodsid, count ) values ( '1111''111''11''20' )
     
    insert into ordergoods ( id, orderid, goodsid, count ) values ( '1112''112''11''10' )
     
    insert into ordergoods ( id, orderid, goodsid, count ) values ( '1113''112''12''15' )
     
    insert into ordergoods ( id, orderid, goodsid, count ) values ( '1114''113''11''30' )
     
    insert into ordergoods ( id, orderid, goodsid, count ) values ( '1115''113''12''45' )
     
    insert into ordergoods ( id, orderid, goodsid, count ) values ( '1116''113''13''60' )


     查詢訂單總價(jià)值

    select t01.orderId,t01.customerName,t02.total from
    (
    select 
       concat(customer.address,
    '商戶',customer.name) as customerName,
       orderTable.id  
    as orderId  
    from 
       orderTable,
       customer
    where 
       ordertable.customerid
    =customer.id) t01,
    (
    select orderid,sum(ordergoods.count*goods.price) as total
    from ordergoods,
         goods
    where
         ordergoods.goodsid
    =goods.id
    group by orderid) t02
    where t01.orderid=t02.orderid

    查詢結(jié)果

    查詢訂單貨物細(xì)節(jié)

    select ordergoods.orderid,ordergoods.count,goods.name,goods.price
    from ordergoods,
         goods
    where
         ordergoods.goodsid
    =goods.id
    order by orderid


    查詢結(jié)果

     

    posted on 2008-09-19 11:42 sitinspring 閱讀(2868) 評(píng)論(5)  編輯  收藏 所屬分類: DB&SQL

    評(píng)論

    # re: 數(shù)據(jù)庫設(shè)計(jì)三范式應(yīng)用實(shí)戰(zhàn)[未登錄] 2008-09-19 17:32 june

    訂單表orderTable
    id:主鍵,訂單流水id
    customerId:下訂單的客戶id,客戶表Id的外鍵

    訂單商品表ordergoods
    id:主鍵
    orderId:訂單表id的外鍵
    goodsId:商品表id的外鍵
    count:商品數(shù)量

    拋開訂單流水的概念(因業(yè)務(wù)而定,在當(dāng)前這個(gè)中業(yè)務(wù)中肯定是需要的),為什么不把兩個(gè)表合起來呢?
    如下:

    訂單商品表ordergoods
    客戶id和商品表id兩個(gè)一起做主鍵
    customerId:客戶id的外鍵
    goodsId:商品表id的外鍵
    count:商品數(shù)量
      回復(fù)  更多評(píng)論   

    # re: 數(shù)據(jù)庫設(shè)計(jì)三范式應(yīng)用實(shí)戰(zhàn) 2008-09-20 20:36 sitinspring

    @june

    目前這么做也未為不可。但考慮到業(yè)務(wù)的擴(kuò)展,能細(xì)分的還是先細(xì)分下去,如果使用后再調(diào)整表結(jié)構(gòu)往往已經(jīng)為時(shí)太晚了。  回復(fù)  更多評(píng)論   

    # re: 數(shù)據(jù)庫設(shè)計(jì)三范式應(yīng)用實(shí)戰(zhàn) 2008-09-28 17:14 YZ

    支持,這才叫做原創(chuàng)!  回復(fù)  更多評(píng)論   

    # re: 數(shù)據(jù)庫設(shè)計(jì)三范式應(yīng)用實(shí)戰(zhàn) 2009-04-28 10:27 學(xué)與習(xí)

    動(dòng)作描述 使用聚集索引 使用非聚集索引
    -----------------------------------------------------------
    列經(jīng)常被分組排序 應(yīng) 應(yīng)
    返回某范圍內(nèi)的數(shù)據(jù) 應(yīng) 不應(yīng)
    一個(gè)或極少不同值 不應(yīng) 不應(yīng)

    感覺樓主建的主鍵不太對(duì)哦  回復(fù)  更多評(píng)論   

    # re: 數(shù)據(jù)庫設(shè)計(jì)三范式應(yīng)用實(shí)戰(zhàn) 2009-04-29 01:37 學(xué)與習(xí)

    @sitinspring


    ordergoods與ordertable設(shè)計(jì)我很不理解,看了您對(duì)一樓的回復(fù),您說是應(yīng)用業(yè)務(wù)擴(kuò)展,我真是想不出來,這對(duì)業(yè)務(wù)有什么幫助,希望樓主,可以舉個(gè)例子{只要說明就行了}。

    順便說一下,非常支持樓主的原創(chuàng)精神

      回復(fù)  更多評(píng)論   


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    sitinspring(http://m.tkk7.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
    主站蜘蛛池模板: 中文字幕乱码免费视频| 狠狠入ady亚洲精品| 亚洲性天天干天天摸| 亚洲日韩中文字幕在线播放| 国产成人精品日本亚洲专区| 国产亚洲精久久久久久无码AV| 亚洲男人的天堂一区二区| 在线观看亚洲天天一三视| 亚洲理论电影在线观看| 国产av无码专区亚洲av桃花庵| 亚洲av永久无码精品秋霞电影影院| 久久久久久久综合日本亚洲| 亚洲视频精品在线| 亚洲欧洲日本精品| 亚洲乱码在线观看| 小说区亚洲自拍另类| 又硬又粗又长又爽免费看| 嫩草在线视频www免费看| 免费人妻无码不卡中文字幕系| 每天更新的免费av片在线观看| 999国内精品永久免费观看| 24小时免费直播在线观看| 国产女高清在线看免费观看| 亚洲欧洲精品成人久久奇米网| 亚洲精品卡2卡3卡4卡5卡区| 337p日本欧洲亚洲大胆艺术| 亚洲入口无毒网址你懂的| 国产午夜亚洲精品不卡免下载| 国产精品极品美女自在线观看免费| 中国在线观看免费的www| 99在线热视频只有精品免费| 中文字幕无码视频手机免费看| 在线免费观看毛片网站| 亚洲综合另类小说色区色噜噜| 久久国产精品亚洲综合| 亚洲一级毛片在线播放| 婷婷国产偷v国产偷v亚洲| 免费国产在线视频| 免费看片免费播放| 亚洲中文字幕不卡无码| 亚洲国产美女在线观看|