亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

淺談數據庫設計技巧(下)

2019-11-03 08:36:56
字體:
來源:轉載
供稿:網友

  三、多用戶及其權限管理的設計
  開發數據庫管理類的軟件,不可能不考慮多用戶和用戶權限設置的問題。盡管目前市面上的大、中型的后臺數據庫系統軟件都提供了多用戶,以及細至某個數據庫內某張表的權限設置的功能,我個人建議:一套成熟的數據庫管理軟件,還是應該自行設計用戶管理這塊功能,原因有二:
  1.那些大、中型后臺數據庫系統軟件所提供的多用戶及其權限設置都是針對數據庫的共有屬性,并不一定能完全滿足某些特例的需求;
  2.不要過多的依賴后臺數據庫系統軟件的某些特殊功能,多種大、中型后臺數據庫系統軟件之間并不完全兼容。否則一旦日后需要轉換數據庫平臺或后臺數據庫系統軟件版本升級,之前的架構設計很可能無法重用。

  下面看看如何自行設計一套比較靈活的多用戶管理模塊,即該數據庫管理軟件的系統管理員可以自行添加新用戶,修改已有用戶的權限,刪除已有用戶。首先,分析用戶需求,列出該數據庫管理軟件所有需要實現的功能;然后,根據一定的聯系對這些功能進行分類,即把某類用戶需使用的功能歸為一類;最后開始建表:
  
功能表(Function_table)
名稱     類型    約束條件   說明
f_id          int        無重復     功能標識,主鍵
f_name        char(20)    不允許為空   功能名稱,不允許重復
f_desc        char(50)    允許為空     功能描述

用戶組表(User_group)
名稱     類型    約束條件   說明
group_id      int         無重復        用戶組標識,主鍵
group_name    char(20)    不允許為空    用戶組名稱
group_power   char(100)   不允許為空    用戶組權限表,內容為功能表f_id的集合

用戶表(User_table)
名稱     類型    約束條件   說明
user_id       int         無重復        用戶標識,主鍵
user_name     char(20)    無重復        用戶名
user_pwd      char(20)    不允許為空    用戶密碼
user_type     int         不允許為空    所屬用戶組標識,和User_group.group_id關聯

  采用這種用戶組的架構設計,當需要添加新用戶時,只需指定新用戶所屬的用戶組;當以后系統需要添加新功能或對舊有功能權限進行修改時,只用操作功能表和用戶組表的記錄,原有用戶的功能即可相應隨之變化。當然,這種架構設計把數據庫管理軟件的功能判定移到了前臺,使得前臺開發相對復雜一些。但是,當用戶數較大(10人以上),或日后軟件升級的概率較大時,這個代價是值得的。


  四、簡潔的批量m:n設計
  碰到m:n的關系,一般都是建立3個表,m一個,n一個,m:n一個。但是,m:n有時會遇到批量處理的情況,例如到圖書館借書,一般都是允許用戶同時借閱n本書,如果要求按批查詢借閱記錄,即列出某個用戶某次借閱的所有書籍,該如何設計呢?讓我們建好必須的3個表先:

書籍表(Book_table)
名稱     類型    約束條件   說明
book_id       int         無重復        書籍標識,主鍵
book_no       char(20)    無重復        書籍編號
book_name     char(100)   不允許為空    書籍名稱
……

借閱用戶表(Renter_table)
名稱     類型    約束條件   說明
renter_id     int         無重復        用戶標識,主鍵
renter_name   char(20)    不允許為空    用戶姓名
……

借閱記錄表(Rent_log)
名稱     類型    約束條件   說明
rent_id       int         無重復        借閱記錄標識,主鍵
r_id          int         不允許為空    用戶標識,和Renter_table.renter_id關聯
b_id          int         不允許為空    書籍標識,和Book_table.book_id關聯
rent_date     datetime    不允許為空    借閱時間
……

  為了實現按批查詢借閱記錄,我們可以再建一個表來保存批量借閱的信息,例如:

批量借閱表(Batch_rent)
名稱     類型    約束條件   說明
batch_id      int         無重復        批量借閱標識,主鍵
batch_no      int         不允許為空    批量借閱編號,同一批借閱的batch_no相同
rent_id       int         不允許為空    借閱記錄標識,和Rent_log.rent_id關聯
batch_date    datetime    不允許為空    批量借閱時間

  這樣的設計好嗎?我們來看看為了列出某個用戶某次借閱的所有書籍,需要如何查詢?首先檢索批量借閱表(Batch_rent),把符合條件的的所有記錄的rent_id字段的數據保存起來,再用這些數據作為查詢條件帶入到借閱記錄表(Rent_log)中去查詢。那么,有沒有什么辦法改進呢?下面給出一種簡潔的批量設計方案,不需添加新表,只需修改一下借閱記錄表(Rent_log)即可。修改后的記錄表(Rent_log)如下:

借閱記錄表(Rent_log)
名稱     類型    約束條件   說明
rent_id       int         無重復        借閱記錄標識,主鍵
r_id          int         不允許為空    用戶標識,和Renter_table.renter_id關聯
b_id          int         不允許為空    書籍標識,和Book_table.book_id關聯
batch_no      int         不允許為空    批量借閱編號,同一批借閱的batch_no相同
rent_date     datetime    不允許為空    借閱時間
……

  其中,同一次借閱的batch_no和該批第一條入庫的rent_id相同。舉例:假設當前最大rent_id是64,接著某用戶一次借閱了3本書,則批量插入的3條借閱記錄的batch_no都是65。之后另外一個用戶租了一套碟,再插入出租記錄的rent_id是68。采用這種設計,查詢批量借閱的信息時,只需使用一條標準T_SQL的嵌套查詢即可。當然,這種設計不符合3NF,但是和上面標準的3NF設計比起來,哪一種更好呢?答案就不用我說了吧。


  五、冗余數據的取舍
  上篇的“樹型關系的數據表”中保留了一個冗余字段,這里的例子更進一步——添加了一個冗余表。先看看例子:我原先所在的公司為了解決員工的工作餐,和附近的一家小餐館聯系,每天吃飯記賬,費用按人數平攤,月底由公司現金結算,每個人每個月的工作餐費從工資中扣除。當然,每天吃飯的人員和人數都不是固定的,而且,由于每頓工作餐的所點的菜色不同,每頓的花費也不相同。例如,星期一中餐5人花費40元,晚餐2人花費20,星期二中餐6人花費36元,晚餐3人花費18元。為了方便計算每個人每個月的工作餐費,我寫了一個簡陋的就餐記賬管理程序,數據庫里有3個表:

員工表(Clerk_table)
名稱     類型    約束條件   說明
clerk_id      int         無重復        員工標識,主鍵
clerk_name    char(10)    不允許為空    員工姓名

每餐總表(Eatdata1)
名稱     類型    約束條件   說明
totle_id      int         無重復        每餐總表標識,主鍵
persons       char(100)   不允許為空    就餐員工的員工標識集合
eat_date      datetime    不允許為空    就餐日期
eat_type      char(1)     不允許為空    就餐類型,用來區分中、晚餐
totle_PRice   money       不允許為空    每餐總花費
persons_num   int         不允許為空    就餐人數

就餐計費細表(Eatdata2)
名稱     類型    約束條件   說明
id            int         無重復        就餐計費細表標識,主鍵
t_id          int         不允許為空    每餐總表標識,和Eatdata1.totle_id關聯
c_id          int         不允許為空    員工標識標識,和Clerk_table.clerk_id關聯
price         money       不允許為空    每人每餐花費

  其中,就餐計費細表(Eatdata2)的記錄就是把每餐總表(Eatdata1)的一條記錄按就餐員工平攤拆開,是個不折不扣的冗余表。當然,也可以把每餐總表(Eatdata1)的部分字段合并到就餐計費細表(Eatdata2)中,這樣每餐總表(Eatdata1)就成了冗余表,不過這樣所設計出來的就餐計費細表重復數據更多,相比來說還是上面的方案好些。但是,就是就餐計費細表(Eatdata2)這個冗余表,在做每月每人餐費統計的時候,大大簡化了編程的復雜度,只用類似這么一條查詢語句即可統計出每人每月的寄餐次數和餐費總帳:

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

  想象一下,如果不用這個冗余表,每次統計每人每月的餐費總帳時會多麻煩,程序效率也夠嗆。那么,到底什么時候可以增加一定的冗余數據呢?我認為有2個原則:

  1、用戶的整體需求。當用戶更多的關注于,對數據庫的規范記錄按一定的算法進行處理后,再列出的數據。如果該算法可以直接利用后臺數據庫系統的內嵌函數來完成,此時可以適當的增加冗余字段,甚至冗余表來保存這些經過算法處理后的數據。要知道,對于大批量數據的查詢,修改或刪除,后臺數據庫系統的效率遠遠高于我們自己編寫的代碼。
 ?。?、簡化開發的復雜度。現代軟件開發,實現同樣的功能,方法有很多。盡管不必要求程序員精通絕大部分的開發工具和平臺,但是還是需要了解哪種方法搭配哪種開發工具的程序更簡潔,效率更高一些。冗余數據的本質就是用空間換時間,尤其是目前硬件的發展遠遠高于軟件,所以適當的冗余是可以接受的。不過我還是在最后再強調一下:不要過多的依賴平臺和開發工具的特性來簡化開發,這個度要是沒把握好的話,后期維護升級會栽大跟頭的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97在线视频免费看| 亚洲高清av在线| 国产精品免费久久久| 欧美日本在线视频中文字字幕| 国产成人综合一区二区三区| 在线亚洲午夜片av大片| 国产一区二区三区直播精品电影| 欧美一级视频一区二区| 人人爽久久涩噜噜噜网站| 国产99视频精品免视看7| 九色成人免费视频| 久久亚洲春色中文字幕| 久久久久久久av| 在线观看日韩欧美| 亚洲精品一区中文| 日韩不卡中文字幕| 亚洲欧美成人一区二区在线电影| 九九热精品视频国产| 日本欧美爱爱爱| 97精品免费视频| 91久久精品国产91久久| xxav国产精品美女主播| 亚洲少妇激情视频| 欧美精品手机在线| 欧美成人精品一区| 中文字幕国内精品| 97精品视频在线观看| 最近2019好看的中文字幕免费| 欧美一级淫片丝袜脚交| 69国产精品成人在线播放| 精品国产一区二区三区久久久| 欧美夜福利tv在线| 欧美日韩在线视频观看| 青青草原一区二区| 欧美性高潮在线| 亚洲综合中文字幕68页| 91精品在线观看视频| 日韩在线观看免费网站| 欧美激情综合色综合啪啪五月| 亚洲欧美福利视频| 一区二区三区国产在线观看| 久久综合久久88| 国产成人一区二区三区| 992tv在线成人免费观看| 亚洲最大中文字幕| 91伊人影院在线播放| 国产精品日韩欧美| 91国产高清在线| 久久99精品久久久久久噜噜| 欧美激情视频一区| 久久免费国产精品1| 成人中文字幕在线观看| 亚洲香蕉av在线一区二区三区| 亚洲欧美第一页| 亚洲欧洲在线看| 亚洲小视频在线| 久久中文久久字幕| 国产精品久久久久久久久久小说| 国产成人免费91av在线| 亚洲国产精品成人va在线观看| 97在线视频观看| 久久免费精品日本久久中文字幕| 另类图片亚洲另类| 亚洲人成伊人成综合网久久久| 成人黄色影片在线| 91久久国产精品| 亚洲成人精品视频| 欧美日韩国产精品一区| 日韩电影免费在线观看| 一本大道久久加勒比香蕉| 精品毛片三在线观看| 国产精品 欧美在线| 国产一区二区三区视频免费| 日韩精品在线观看视频| 精品动漫一区二区| 日韩av资源在线播放| 亚洲欧洲国产伦综合| 亚洲精品国产精品国产自| 中文字幕日韩欧美精品在线观看| 亚洲福利视频在线| 亚洲综合精品一区二区| 国产精品欧美一区二区三区奶水| 青草青草久热精品视频在线网站| 欧美日韩成人在线观看| 成人精品在线观看| 久久97精品久久久久久久不卡| 欧美午夜精品在线| 91精品久久久久| 日韩视频永久免费观看| 45www国产精品网站| 国产欧美日韩视频| 日韩视频免费中文字幕| 久久99久国产精品黄毛片入口| 国产成人黄色av| 在线看日韩av| 92看片淫黄大片看国产片| 成人福利网站在线观看| 久久影视免费观看| 成人女保姆的销魂服务| 欧亚精品在线观看| 亚洲成人黄色网| 日本不卡高字幕在线2019| 欧美激情亚洲综合一区| 91极品视频在线| 97在线精品国自产拍中文| 国产精品视频地址| 91精品国产免费久久久久久| 高清亚洲成在人网站天堂| 麻豆国产va免费精品高清在线| 欧美第一黄网免费网站| 亚洲一区二区三区xxx视频| 欧美在线国产精品| 亚洲欧美日韩天堂| 精品欧美国产一区二区三区| 国产精品老女人视频| 成人性生交大片免费观看嘿嘿视频| 91亚洲精品在线观看| 色综合伊人色综合网| 欧美一区二区三区图| 亚洲香蕉伊综合在人在线视看| 日韩成人在线视频| 国产69精品久久久久久| 中文字幕欧美国内| 欧美激情免费看| 欧美激情亚洲视频| 超碰97人人做人人爱少妇| 亚洲精品一二区| 日韩免费在线播放| 少妇精69xxtheporn| 国产日韩欧美影视| 欧美在线免费看| 亚洲国产小视频在线观看| 欧美另类极品videosbest最新版本| 成人精品在线观看| 欧美日韩另类字幕中文| 欧美乱大交xxxxx| 国产成人午夜视频网址| 日韩亚洲综合在线| 国产在线视频一区| 亚洲人成网7777777国产| 日韩视频免费中文字幕| 不卡伊人av在线播放| 精品久久久久人成| 欧美日韩一区二区精品| 国产91精品久久久久| 亚洲精品日产aⅴ| 亚洲精品美女在线观看| 日韩中文在线不卡| 中文字幕精品网| 97精品国产91久久久久久| 欧美性xxxxx| 国产午夜精品久久久| 国产主播喷水一区二区| 国产精品jizz在线观看麻豆| 亚洲免费视频在线观看| 欧美在线xxx| 亚洲综合在线中文字幕| 久久99热这里只有精品国产| 国语自产精品视频在线看抢先版图片| 久久成年人免费电影| 亚洲一区免费网站| 中文字幕v亚洲ⅴv天堂| 久久综合网hezyo| 日韩在线观看免费高清|