第一篇:學(xué)習(xí)數(shù)據(jù)庫的心得
轉(zhuǎn)眼間在從大一踏進(jìn)學(xué)校的校門到現(xiàn)在剛剛好一年了,在這一年中,數(shù)據(jù)庫也如影隨形。
在這一年中我主要學(xué)習(xí)的數(shù)據(jù)庫是sql serverXX,在學(xué)習(xí)的時候過程中,我們首先是從基礎(chǔ)開始,比如數(shù)據(jù)類型、運(yùn)算符號、關(guān)鍵字等等,然后上升到一些增刪改查,還有觸發(fā)、存儲過程等的使用等等。
經(jīng)過了一學(xué)期的學(xué)習(xí),我從起初對數(shù)據(jù)庫的認(rèn)識模糊到后來清晰,深入,我認(rèn)為我學(xué)到了許許多多的東西。當(dāng)然,在學(xué)習(xí)中,薛立柱會給我們在網(wǎng)上下很多的學(xué)習(xí)資料,同時他也會建議我們多讀讀網(wǎng)上的學(xué)習(xí)資料。除了這個以外,我在學(xué)習(xí)數(shù)據(jù)庫課程過程中,接觸到的軟件工程思想,網(wǎng)上學(xué)習(xí)經(jīng)驗(yàn),以及利用網(wǎng)絡(luò)的學(xué)習(xí)資源都很好的改善了我的學(xué)習(xí)。后來,在學(xué)習(xí)的深入中,雖然學(xué)習(xí)有時是十分叫人感到枯燥乏味的,但我慶幸的是我堅(jiān)持了下來,在最后的考試復(fù)習(xí)中,薛立柱老師雖然勸誡我學(xué)習(xí)不要因?yàn)榭荚嚩V埂J前?!要想學(xué)好一門功課我們需要的是持之以恒的精神。
數(shù)據(jù)庫編程,這個是作為一個程序員的基本功,絕大多數(shù)軟件開發(fā)公司數(shù)據(jù)庫編程都是由程序員自己完成的,因?yàn)樗墓ぷ髁坎皇呛艽?,也不是很?fù)雜。所以作為一個綜合的程序員,學(xué)習(xí)數(shù)據(jù)庫編程,像數(shù)據(jù)庫四大操作,增刪改查,還有觸發(fā)、存儲過程等的使用,這些都是基礎(chǔ)的基礎(chǔ)。很多時候我們會認(rèn)為數(shù)據(jù)庫沒什么作用,學(xué)習(xí)的時候吊兒郎當(dāng),到今年做項(xiàng)目時,還不會連接查詢,要想避免這種情況發(fā)生就必須打好基礎(chǔ),扎實(shí)的掌握每個知識點(diǎn)。
只要你從事計(jì)算機(jī)行業(yè),就需要學(xué)習(xí)好數(shù)據(jù)庫的基礎(chǔ)知識,不論以后選擇哪個方向,數(shù)據(jù)庫的學(xué)習(xí)都不能放松。古人云:書到用時方恨少,知識學(xué)多了不會成為累贅,慢慢的積累,總有用到的時候。給自己明確一個目標(biāo),剩下的就是向著這個目標(biāo)努力,無論遇到什么困難,克服它就向成功邁進(jìn)了一步。
學(xué)習(xí)數(shù)據(jù)庫的心得(2):
一:學(xué)習(xí)心得
經(jīng)過一個學(xué)期的數(shù)據(jù)庫課程的學(xué)習(xí),我們掌握了創(chuàng)建數(shù)據(jù)庫以及對數(shù)據(jù)庫的操作的基礎(chǔ)知識。數(shù)據(jù)庫這門課涉及到以前的知識不多,是一門從頭學(xué)起的課程,即使基礎(chǔ)不是很好,只要認(rèn)真聽講、復(fù)習(xí)功課,還是一門比較容易掌握的課。
課堂上講的知識比較理論化,如果不動手就無法將知識轉(zhuǎn)化為技能,而動手去做能夠讓我們將學(xué)過的知識在實(shí)踐中運(yùn)用,找到知識漏洞,并且能學(xué)到更多關(guān)于實(shí)際操作的知識和技巧。并且培養(yǎng)了我們的自學(xué)能力。
第一次接觸sql語言,雖然陌生,但是可以讓我從頭開始學(xué),就算沒有基礎(chǔ)的人也可以學(xué)得很好。剛開始練習(xí)sql語言的時候,并不是很難,基本上都是按照老師的步驟來做,還很有成就感。我們通過老師的一些ppt,我們可以鞏固課內(nèi)的知識,還可以學(xué)習(xí)內(nèi)容相關(guān)的知識,更好地完成老師布置的作業(yè)。
二、access與excel的區(qū)別
access--中小型數(shù)據(jù)庫開發(fā)系統(tǒng),內(nèi)嵌vba編程語言,面向?qū)ο缶幊?/p>
excel--數(shù)據(jù)表格處理系統(tǒng),編程能力有限.access是數(shù)據(jù)庫管理軟件,內(nèi)含的是數(shù)據(jù)庫(基本對象),一個數(shù)據(jù)庫包含多張表 主要用于開發(fā)系統(tǒng),日常辦公用起來不方便,他主要是做軟件的后臺的。
而excel只是一般的表格處理軟件,主要用于一些日常的辦公而已
兩都所用到的地方不一樣.access是一個數(shù)據(jù)庫軟件,一個access文件由存儲特定結(jié)構(gòu)化數(shù)據(jù)集的表集合組成。表中包含行(有時稱作記錄或元組)和列(有時稱作特性)的集合。表中的每一列都設(shè)計(jì)為存儲某種類型的信息(例如,日期、名稱、美元金額或數(shù)字)。表上有幾種控制(約束、規(guī)則、觸發(fā)器、默認(rèn)值和自定義用戶數(shù)據(jù)類型)用于確保數(shù)據(jù)的有效性。表上可以有索引(與書中的索引非常相似),利用索引可以快速地找到行??蓪⒙暶饕猛暾?dri)約束添加到表上,以確保不同表中相互關(guān)聯(lián)的數(shù)據(jù)保持一致。
而excel是一個電子表格制作軟件,其表格可以進(jìn)行排序、計(jì)算等操作.從我個人理解,在電腦同樣的配置的情況下excel在處理大量數(shù)據(jù)的速度遠(yuǎn)遠(yuǎn)落后與access,在數(shù)據(jù)配比上access在性能上更高于excel,三、學(xué)習(xí)數(shù)據(jù)庫的收獲
sql(結(jié)構(gòu)化查詢語言)是用于執(zhí)行查詢的語法。但是 sql 語言也包含用于更新、插入和刪除記錄的語法。
查詢和更新指令構(gòu)成了 sql 的 dml 部分:
select更新數(shù)據(jù)庫表中的數(shù)據(jù)
delete向數(shù)據(jù)庫表中插入數(shù)據(jù)
sql 的數(shù)據(jù)定義語言(ddl)部分使我們有能力創(chuàng)建或刪除表格。我們也可以定義索引(鍵),規(guī)定表之間的鏈接,以及施加表間的約束。
sql 中最重要的 ddl 語句:
create database修改數(shù)據(jù)庫
create table變更(改變)數(shù)據(jù)庫表
drop table創(chuàng)建索引(搜索鍵)
drop index-刪除索引
數(shù)據(jù)庫有保持?jǐn)?shù)據(jù)的獨(dú)立性,所謂數(shù)據(jù)獨(dú)立,是指存儲在數(shù)據(jù)庫中的數(shù)據(jù)獨(dú)立于處理數(shù)據(jù)的所有應(yīng)用程序而存在。也就是說,數(shù)據(jù)是客觀實(shí)體的符號化標(biāo)識,它就是一個客觀存在,不會因?yàn)槟骋豁?xiàng)應(yīng)用的需要而改變它的結(jié)構(gòu),因此是獨(dú)立于應(yīng)用而存在著的客觀實(shí)體。而某一項(xiàng)應(yīng)用是處理數(shù)據(jù)獲取信息的過程,也就是應(yīng)用程序,它只能根據(jù)客觀存在著的數(shù)據(jù)來設(shè)計(jì)所需要的數(shù)據(jù)處理方法,而不會去改變客觀存在著的數(shù)據(jù)本身。數(shù)據(jù)庫的傳統(tǒng)定義是以一定的組織方式存儲的一組相關(guān)數(shù)據(jù)的集合,主要表現(xiàn)為數(shù)據(jù)表的集合。
根據(jù)標(biāo)準(zhǔn),sql語句按其功能的不同可以分為以下6大類:
數(shù)據(jù)定義語句(data-definition language,ddl);
數(shù)據(jù)操作語句(data-manipulation languagesql serverXX 功能,dml);
操作管理語句(transaction-management language,tml);
數(shù)據(jù)控制語句(data-control language,dcl);
數(shù)據(jù)查詢語句(data-query language,dql);
游標(biāo)控制語句(cursor-control language,ccl)。
這門課中仍然有許多不太懂的地方,還需要以后進(jìn)一步學(xué)習(xí)。
第二篇:SQL數(shù)據(jù)庫學(xué)習(xí)筆記與心得(定稿)
SQL數(shù)據(jù)庫學(xué)習(xí)筆記與心得
0961140107
SQL是市場占有率最大的數(shù)據(jù)庫之一,是信息化社會的產(chǎn)物,是整理、查詢、分析數(shù)據(jù)的強(qiáng)有力工具。我對于SQL數(shù)據(jù)庫的學(xué)習(xí)是在實(shí)驗(yàn)與探索之中度過的。
下面將我本學(xué)期所學(xué)的主要知識簡單總結(jié)如下:
共分四大塊:
一、數(shù)據(jù)庫基本原理;
二、SQL標(biāo)準(zhǔn)語言;
三、數(shù)據(jù)庫設(shè)計(jì);
四、數(shù)據(jù)庫安全。
一、數(shù)據(jù)庫基本原理
數(shù)據(jù)庫技術(shù)是計(jì)算機(jī)領(lǐng)域中發(fā)展最快的技術(shù)之一。數(shù)據(jù)模型是數(shù)據(jù)庫系統(tǒng)的核心和基礎(chǔ)。常用的數(shù)據(jù)模型有層次模型、網(wǎng)狀模型、關(guān)系模型、面向?qū)ο竽P?、對象關(guān)系模型。其中關(guān)系模型是目前最重要的一種數(shù)據(jù)模型。關(guān)系數(shù)據(jù)庫是我們需要掌握的重點(diǎn)。
關(guān)系模型中常用的關(guān)系操作包括:查詢操作和插入、刪除、修改操作兩大部分。關(guān)系的查詢表達(dá)能力很強(qiáng),是關(guān)系操作中最主要的部分。
二、SQL標(biāo)準(zhǔn)語言
SQL(Structured Query Language),即結(jié)構(gòu)化查詢語言,是關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。SQL標(biāo)準(zhǔn)語言從1986年公布以來隨著數(shù)據(jù)庫技術(shù)的發(fā)展不斷發(fā)展,不斷豐富。
SQL 功能動詞
數(shù) 據(jù) 定 義 CREATE,DROP,ALTER
數(shù) 據(jù) 查 詢 SELECT
數(shù) 據(jù) 操 縱 INSERT,UPDATE,DELETE
數(shù) 據(jù) 控 制 GRANT,REVOKE
SQL之所以能夠?yàn)橛脩艉蜆I(yè)界所接受,并成為國際標(biāo)準(zhǔn),是因?yàn)樗且粋€綜合的、功能極強(qiáng)同時又簡潔易學(xué)的語言。SQL集數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義林巧
和數(shù)據(jù)控制功能于一體。有如下特點(diǎn):1)綜合統(tǒng)一;2)高度過程化;3)面向集合的操作方式;4)以同一種語法結(jié)構(gòu)提供多種使用方式;5)語言簡潔,易學(xué)易用。
SQL的數(shù)據(jù)定義語句:
創(chuàng)建刪除修改
表CREATE TABLEDROP TABLEALTER TABLE
視圖 CREATE VIEWDROP VIEW
索引 CREATE INDEXDROP INDEX
數(shù)據(jù)庫查詢是數(shù)據(jù)庫的核心操作。也是數(shù)據(jù)庫學(xué)習(xí)的重點(diǎn)和難點(diǎn)。SQL提供了SELECT語句進(jìn)行數(shù)據(jù)庫的查詢,該語句具有靈活的使用方式和豐富的功能。其一般格式為:
SELECT [ALL|DISTINCT] <目標(biāo)列表達(dá)式>
FROM <表名或視圖名>[,<表名或視圖名> ] …
[ WHERE <條件表達(dá)式> ]
[ GROUP BY <列名1> [ HAVING <條件表達(dá)式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
SELECT語句既可以完成簡單的單表查詢,也可以完成復(fù)雜的連接查詢和嵌套查詢。
(一)、單表查詢
1、選擇表中的若干列:
2、選擇表中的若干元組;
2)查詢滿足條件的元組。WHERE子句常用的查詢條件有
3、ORDER BY子句。
4、聚集函數(shù)。
5、ORDER BY子句
(二)、連接查詢
1、等值與非等值連接查詢;
2、自然連接;
3、外連接;
4、復(fù)合條件連接。
(三)、嵌套查詢
1、帶有IN謂語的子查詢;
2、帶有比較運(yùn)算符的子查詢;
3、帶有ANY(SOME)或ALL謂語的子查詢;
4、帶有EXISTS謂詞的子查詢。
(四)、集合查詢。
數(shù)據(jù)的更新操作有三種:向表中添加若干行數(shù)據(jù)、修改表中的數(shù)據(jù)和刪除表中的若干行數(shù)據(jù)。
三、數(shù)據(jù)庫設(shè)計(jì)
數(shù)據(jù)庫設(shè)計(jì)是指對于一個給定的應(yīng)用環(huán)境,構(gòu)造最優(yōu)的數(shù)據(jù)庫模式,建立數(shù)據(jù)庫及其應(yīng)用系統(tǒng),使之能夠有效地存儲數(shù)據(jù),滿足各種用戶的應(yīng)用需求(信息要求和處理要求
數(shù)據(jù)庫設(shè)計(jì)的基本步驟:
1、數(shù)據(jù)庫設(shè)計(jì)的準(zhǔn)備工作;
2、數(shù)據(jù)庫設(shè)計(jì)的過程(六個階段): 1)需求分析階段;2)概念結(jié)構(gòu)設(shè)計(jì)階段;3)邏輯結(jié)構(gòu)設(shè)計(jì)階段;4)數(shù)據(jù)庫物理設(shè)計(jì)階段;5)數(shù)據(jù)庫實(shí)施階段;6)數(shù)據(jù)庫運(yùn)行和維護(hù)階段.
四、數(shù)據(jù)庫安全
數(shù)據(jù)庫的安全性是指保護(hù)數(shù)據(jù)庫,防止因用戶非法使用數(shù)據(jù)庫造成數(shù)據(jù)泄露、更改或破壞。課本中講述了三類計(jì)算機(jī)系統(tǒng)安全性問題:技術(shù)安全類、管理安全類和政策法律類。
如何控制數(shù)據(jù)庫的安全性? 其常用的方法有:1)用戶標(biāo)識和鑒定2)存取控制;3)視圖;4)審計(jì);5)密碼存儲.
數(shù)據(jù)庫的完整性:即數(shù)據(jù)的正確性和相容性防止不合語義的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫。例如:學(xué)生的年齡必須是整數(shù),取值范圍為14--29;學(xué)生的性別只能是男或女;學(xué)生的學(xué)號一定是唯一的; 學(xué)生所在的系必須是學(xué)校開設(shè)的系;
以上是我對SQL數(shù)據(jù)庫重點(diǎn)知識的理解。通過學(xué)習(xí)本課程和上機(jī)實(shí)驗(yàn),我了解了數(shù)據(jù)庫的概念及其重要性,還有其今后的發(fā)展方向,這將有利于我今后更好地把握時代之脈搏。
第三篇:數(shù)據(jù)庫實(shí)驗(yàn)心得
我在sql server 索引基礎(chǔ)知識系列中,第一篇就講了記錄數(shù)據(jù)的基本格式。那里主要講解的是,數(shù)據(jù)庫的最小讀存單元:數(shù)據(jù)頁。一個數(shù)據(jù)頁是8k大小。
對于數(shù)據(jù)庫來說,它不會每次有一個數(shù)據(jù)頁變化后,就存到硬盤。而是變化達(dá)到一定數(shù)量級后才會作這個操作。這時候,數(shù)據(jù)庫并不是以數(shù)據(jù)頁來作為操作單元,而是以64k的數(shù)據(jù)(8個數(shù)據(jù)頁,一個區(qū))作為操作單元。
區(qū)是管理空間的基本單位。一個區(qū)是八個物理上連續(xù)的頁(即 64 kb)。這意味著 sql server 數(shù)據(jù)庫中每 mb 有 16 個區(qū)。
為了使空間分配更有效,sql server 不會將所有區(qū)分配給包含少量數(shù)據(jù)的表。sql server 有兩種類型的區(qū):
統(tǒng)一區(qū),由單個對象所有。區(qū)中的所有 8 頁只能由所屬對象使用。
混合區(qū),最多可由八個對象共享。區(qū)中八頁的每頁可由不同的對象所有。
通常從混合區(qū)向新表或索引分配頁。當(dāng)表或索引增長到 8 頁時,將變成使用統(tǒng)一區(qū)進(jìn)行后續(xù)分配。如果對現(xiàn)有表創(chuàng)建索引,并且該表包含的行足以在索引中生成 8 頁,則對該索引的所有分配都使用統(tǒng)一區(qū)進(jìn)行。
為何會這樣呢?
其實(shí)很簡單:
讀或?qū)?8kb 的時間與讀或?qū)?64 kb的時間幾乎相同。
在 8 kb 到 64 kb 范圍之內(nèi),單個磁盤 i/o 傳輸操作所花的時間主要是磁盤取數(shù)臂和讀/寫磁頭運(yùn)動的時間。
因此,從數(shù)學(xué)上來講,當(dāng)需要傳輸 64 kb 以上的 sql 數(shù)據(jù)時,盡可能地執(zhí)行 64 kb 磁盤傳輸是有益的,即分成數(shù)個64k的操作。
因?yàn)?64 kb 傳輸基本上與 8 kb 傳輸一樣快,而每次傳輸?shù)?sql server 數(shù)據(jù)是 8 kb 傳輸?shù)?8 倍。
我們通過一個實(shí)例來看 有and 操作符時候的最常見的一種情況。我們有下面一個表,create table [dbo].[member]([member_no] [dbo].[numeric_id] identity(1,1)not null, [lastname] [dbo].[shortstring] not null, [firstname] [dbo].[shortstring] not null, [middleinitial] [dbo].[letter] null, [street] [dbo].[shortstring] not null, [city] [dbo].[shortstring] not null, [state_prov] [dbo].[statecode] not null, [country] [dbo].[countrycode] not null, [mail_code] [dbo].[mailcode] not null, [phone_no] [dbo].[phonenumber] null, [photograph] [image] null, [issue_dt] [datetime] not null default(getdate()), [expr_dt] [datetime] not null default(dateadd(year,1,getdate())), [region_no] [dbo].[numeric_id] not null, [corp_no] [dbo].[numeric_id] null, [prev_balance] [money] null default(0), [curr_balance] [money] null default(0), [member_code] [dbo].[status_code] not null default(' '))
這個表具備下面的四個索引:
索引名 細(xì)節(jié) 索引的列
member_corporation_link nonclustered located on primary corp_no
member_ident clustered, unique, primary key located on primary member_no
member_region_link nonclustered located on primary region_no
memberfirstname nonclustered located on primary firstname
當(dāng)我們執(zhí)行下面的sql查詢時候,select m.member_no, m.firstname, m.region_nofrom dbo.member as mwhere m.firstname like 'k%' and m.region_no > 6 and m.member_no < 5000go
sql server 會根據(jù)索引方式,優(yōu)化成下面方式來執(zhí)行。
select a.member_no,a.firstname,b.region_nofrom(select m.member_no, m.firstname from dbo.member as m where m.firstname like 'k%' and m.member_no < 5000)a ,--這個查詢可以直接使用 memberfirstname 非聚集索引,而且這個非聚集索引覆蓋了所有查詢列--實(shí)際執(zhí)行時,只需要 邏輯讀取 3 次
(select m.member_no, m.region_no from dbo.member as mwhere m.region_no > 6)b
--這個查詢可以直接使用 member_region_link 非聚集索引,而且這個非聚集索引覆蓋了所有查詢列--實(shí)際執(zhí)行時,只需要 邏輯讀取 10 次
where a.member_no = b.member_no
不信,你可以看這兩個sql 的執(zhí)行計(jì)劃,以及邏輯讀信息,都是一樣的。
其實(shí)上面的sql,如果優(yōu)化成下面的方式,實(shí)際的邏輯讀消耗也是一樣的。為何sql server 不會優(yōu)化成下面的方式。是因?yàn)?and 操作符優(yōu)化的另外一個原則。
1/26 的數(shù)據(jù)和 1/6 的數(shù)據(jù)找交集的速度要比 1/52 的數(shù)據(jù)和 1/3 的數(shù)據(jù)找交集速度要慢。
select a.member_no,a.firstname,b.region_nofrom(select m.member_no, m.firstname from dbo.member as mwhere m.firstname like 'k%'--1/26 數(shù)據(jù))a,(select m.member_no, m.region_no from dbo.member as mwhere m.region_no > 6 and m.member_no < 5000--1/3 * 1/ 2 數(shù)據(jù))bwhere a.member_no = b.member_no
當(dāng)然,我們要學(xué)習(xí)sql 如何優(yōu)化的話,就會用到查詢語句中的一個功能,指定查詢使用哪個索引來進(jìn)行。
比如下面的查詢語句
select m.member_no, m.firstname, m.region_nofrom dbo.member as m with(index(0))where m.firstname like 'k%' and m.region_no > 6 and m.member_no < 5000go
select m.member_no, m.firstname, m.region_nofrom dbo.member as m with(index(1))where m.firstname like 'k%' and m.region_no > 6 and m.member_no < 5000goselect m.member_no, m.firstname, m.region_nofrom dbo.member as m with(index(membercovering3))where m.firstname like 'k%' and m.region_no > 6 and m.member_no < 5000goselect m.member_no, m.firstname, m.region_nofrom dbo.member as m with(index(memberfirstname, member_region_link))where m.firstname like 'k%' and m.region_no > 6 and m.member_no < 5000go
這里 index 計(jì)算符可以是 0,1,指定的一個或者多個索引名字。對于 0,1 的意義如下:
如果存在聚集索引,則 index(0)強(qiáng)制執(zhí)行聚集索引掃描,index(1)強(qiáng)制執(zhí)行聚集索引掃描或查找(使用性能最高的一種)。
如果不存在聚集索引,則 index(0)強(qiáng)制執(zhí)行表掃描,index(1)被解釋為錯誤。
總結(jié)知識點(diǎn):
簡單來說,我們可以這么理解:sql server 對于每一條查詢語句。會根據(jù)實(shí)際索引情況(sysindexes 系統(tǒng)表中存儲這些信息),分析每種組合可能的成本。然后選擇它認(rèn)為成本最小的一種。作為它實(shí)際執(zhí)行的計(jì)劃。
成本代價(jià)計(jì)算的一個主要組成部分是邏輯i/o的數(shù)量,特別是對于單表的查詢。
and 操作要滿足所有條件,這樣,經(jīng)常會要求對幾個數(shù)據(jù)集作交集。數(shù)據(jù)集越小,數(shù)據(jù)集的交集計(jì)算越節(jié)省成本。的項(xiàng)目中,竟然出現(xiàn)了濫用聚集索引的問題??磥頉]有培訓(xùn)最最基礎(chǔ)的索引的意義,代價(jià),使用場景,是一個非常大的失誤。這篇博客就是從這個角度來羅列索引的基礎(chǔ)知識。
使用索引的意義
索引在數(shù)據(jù)庫中的作用類似于目錄在書籍中的作用,用來提高查找信息的速度。
使用索引查找數(shù)據(jù),無需對整表進(jìn)行掃描,可以快速找到所需數(shù)據(jù)。
使用索引的代價(jià)
索引需要占用數(shù)據(jù)表以外的物理存儲空間。
創(chuàng)建索引和維護(hù)索引要花費(fèi)一定的時間。
當(dāng)對表進(jìn)行更新操作時,索引需要被重建,這樣降低了數(shù)據(jù)的維護(hù)速度。
創(chuàng)建索引的列
主鍵
外鍵或在表聯(lián)接操作中經(jīng)常用到的列
在經(jīng)常查詢的字段上最好建立索引
不創(chuàng)建索引的列
很少在查詢中被引用
包含較少的惟一值
定義為 text、ntext 或者 image 數(shù)據(jù)類型的列
heaps是staging data的很好選擇,當(dāng)它沒有任何index時
excellent for high performance data loading(parallel bulk load and parallel index creation after load)
excellent as a partition to a partitioned view or a partitioned table
聚集索引提高性能的方法,在前面幾篇博客中分別提到過,下面只是一個簡單的大綱,細(xì)節(jié)請參看前面幾篇博客。
何時創(chuàng)建聚集索引?
clustered index會提高大多數(shù)table的性能,尤其是當(dāng)它滿足以下條件時:
獨(dú)特, 狹窄, 靜止: 最重要的條件
持續(xù)增長的,最好是只向上增加。例如:
identity
date, identity
guid(only when using newsequentialid()function)
聚集索引唯一性(獨(dú)特型的問題)
由于聚集索引的b+樹結(jié)構(gòu)的葉子節(jié)點(diǎn)必須指向具體數(shù)據(jù)。如果你要建立聚集索引的列不唯一,并且你指定的創(chuàng)建的聚集索引是非唯一的聚集索引,則會有以下情況:
如果未使用 unique 屬性創(chuàng)建聚集索引,數(shù)據(jù)庫引擎 將向表自動添加一個四字節(jié) uniqueifier 列。必要時,數(shù)據(jù)庫引擎 將向行自動添加一個 uniqueifier 值,使每個鍵唯一。此列和列值供內(nèi)部使用,用戶不能查看或訪問。
第四篇:SQL數(shù)據(jù)庫心得
黃淮學(xué)院 2015---2016學(xué)年第 一 學(xué)期 《C#數(shù)據(jù)庫應(yīng)用程序開發(fā)技術(shù)與案例教程》課程
題目:
學(xué)習(xí)報(bào)告
院
系:數(shù)學(xué)科學(xué)系 專
業(yè):數(shù)學(xué)與應(yīng)用數(shù)學(xué) 年
級:1301B 姓
名:曹占營 學(xué)
號:1331110101 任課教師:楊鋒英
2015年 12 月 30日
C#數(shù)據(jù)庫學(xué)習(xí)報(bào)告
在日常生活中,我們和朋友、親戚聯(lián)系,會廣泛用到通訊錄,因此這門課程以通訊錄開發(fā)為案例,教我們學(xué)習(xí)軟件開發(fā)。
軟件開發(fā)是一項(xiàng)非常注重實(shí)踐工作,不可能只憑看書、看視頻就學(xué)會軟件開發(fā),必須扎扎實(shí)實(shí)、一行一行的編寫代碼,不斷積累項(xiàng)目經(jīng)驗(yàn),才能真正掌握編程技術(shù),所以我們要親自上級編寫程序,才能真正掌握軟件開發(fā)技術(shù)。
本書分為基礎(chǔ)篇、進(jìn)階篇、高級篇,由淺入深地介紹了基于C#的數(shù)據(jù)庫編程技術(shù),所用的開發(fā)工具為Visual Studio 2008、SQL Server 2005以及Access 2007。
學(xué)習(xí)數(shù)據(jù)庫的內(nèi)容是從數(shù)據(jù)庫、數(shù)據(jù)表的創(chuàng)建和修改開始的,表是建立關(guān)系數(shù)據(jù)庫的基本結(jié)構(gòu),用來存儲數(shù)據(jù)具有已定義的屬性,在表的操作過程中,有查看表信息、查看表屬性、修改表中的數(shù)據(jù)、刪除表中的數(shù)據(jù)及修改表和刪除表的操作。從課程中讓我更明白一些知識,查詢可以通過SQL語言進(jìn)行完成,這樣加深了查詢語句的基本結(jié)構(gòu),讓我們能更好的掌握其中語句,方便于我們后面的學(xué)習(xí)和應(yīng)用。表是數(shù)據(jù)最重要的一個數(shù)據(jù)對象,表的創(chuàng)建好壞直接關(guān)系到數(shù)數(shù)據(jù)庫的成敗,表的內(nèi)容是越具體越好,但是也不能太繁瑣,以后在實(shí)際應(yīng)用中多使用表,對表的規(guī)劃和理解就會越深刻。在編程方面是需要我們對于編程有邏輯思維能力及一定的編程技巧。在數(shù)據(jù)庫中插入表、表中的信息等都需要注意,不然很容易出錯。
在基礎(chǔ)篇中,詳細(xì)講解了通訊錄系統(tǒng)的設(shè)計(jì)、開發(fā)和安裝部署這樣一個完整過程,對各個任務(wù)進(jìn)行詳細(xì)講解?;A(chǔ)篇學(xué)習(xí)分為9個任務(wù),分別為系統(tǒng)分析與設(shè)計(jì)、用戶登錄、主窗體設(shè)計(jì)、聯(lián)系人分組管理、聯(lián)系人管理、用戶密碼修改、數(shù)據(jù)庫備份與恢復(fù)、設(shè)計(jì)“關(guān)于”窗體、系統(tǒng)安裝與部署。學(xué)完基礎(chǔ)篇,即可開發(fā)出一個功能較為完備的通訊錄系統(tǒng)。在聯(lián)系人管理任務(wù)學(xué)習(xí)中,由于在Contact表中保存的是分組編號,而窗體上要顯示的是分組名稱,所以在查詢語句中需要級聯(lián)查詢,即SQL語句為”select Contact.Id, Name, Phone, Email, QQ, GroupName from Contact, ContactGroup where Contact.GroupId = ContactGroup.Id”。為了實(shí)現(xiàn)代碼復(fù)用,可以提供查詢功能,根據(jù)用戶選擇的擦尋天劍,拼接產(chǎn)生SQL語句。同時為了支持模糊查詢,還在SQL語句中用了like語句。通過SqlDataAdapter的Fill方法填充數(shù)據(jù)集,獲取數(shù)據(jù)。數(shù)據(jù)集中有了數(shù)據(jù)以后,我們只需設(shè)置DataGridView控件的DataSource屬性,就可以顯示數(shù)據(jù)了。
在進(jìn)階篇中,介紹了企業(yè)項(xiàng)目開發(fā)中廣發(fā)用到的參數(shù)化SQL語句、存儲過程使用及定義數(shù)據(jù)庫操作類,分為3個任務(wù)學(xué)習(xí),分別為使用參數(shù)化SQL語句、使用存儲過程、使用自定義數(shù)據(jù)庫操作類,進(jìn)一步提高我們的數(shù)據(jù)庫編程能力。在使用存儲過程任務(wù)學(xué)習(xí)中,了解到存儲過程是在大型數(shù)據(jù)庫系統(tǒng)中,一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中,用戶通過指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。在性能方面,存儲過程有如下的優(yōu)點(diǎn)。(1)與編譯,存儲過程預(yù)先編譯好放在數(shù)據(jù)庫內(nèi),減少編譯語句所花的時間。(2)緩存,編譯好的存儲過程會進(jìn)入緩存,所以對于經(jīng)常執(zhí)行的存儲過程,除了第一次執(zhí)行外,其他次執(zhí)行的書都會有明顯提高。(3)減少網(wǎng)絡(luò)傳輸,特別對于處理一些數(shù)據(jù)的存儲過程,不必像直接用SQL語句實(shí)現(xiàn)那樣多次傳送數(shù)據(jù)到客戶端。通過前面的學(xué)習(xí),細(xì)細(xì)體會對數(shù)據(jù)庫的操作,可以發(fā)現(xiàn),這么多操作其實(shí)可以分為4種。(1)對數(shù)據(jù)庫進(jìn)行非連接式查詢操作,返回多條記錄。這種操作可以通過SqlDataAdapter對象的Fill方法來完成,即把查詢得到的結(jié)果填充到DataTable(或DataSet)對象中。(2)對數(shù)據(jù)庫進(jìn)行連接式查詢操作,返回多條查詢記錄。這種操作可以通過SqlCommand對象的ExecuteReader方法來完成,返回SqlDataReader對象。(3)從數(shù)據(jù)庫中檢索單值。這種操作可以通過SqlCommand對象的ExecuteNonQuery方法來完成。ExecuteScalar方法返回的是Object類型,需要根據(jù)實(shí)際情況進(jìn)行類型轉(zhuǎn)換。(4)對數(shù)據(jù)庫執(zhí)行增、刪、改操作。這種操作可以通過SqlCommand對象的ExecuteNonQuery方法來完成,返回增、刪、改操作后數(shù)據(jù)庫中受影響的行數(shù)。
在高級篇中,分為4個任務(wù)學(xué)習(xí),分別為開發(fā)基于三層構(gòu)架的通訊錄程序、開發(fā)基于Access的通訊錄程序、實(shí)現(xiàn)基于抽象工廠模式的三層架構(gòu)、使用MD5加密用戶密碼。首先詳細(xì)講解了基于三層構(gòu)架的通訊錄程序開發(fā)過程以及如何開發(fā)一個基于Access的通訊錄系統(tǒng)。最后,介紹了如何采用MD5加密技術(shù)對用戶密碼加密。MD5加密技術(shù)也是實(shí)際項(xiàng)目開發(fā)中廣泛用到的,通過MD5加密用戶密碼,可以提高程序的安全性。“三層架構(gòu)”一詞中的“三層”是指:“表示層”、“業(yè)務(wù)邏輯層”、“數(shù)據(jù)訪問層”。表示層:位于最外層,離用戶最近。用于顯示和接收用戶輸入的數(shù)據(jù),為用戶提供一種交互式操作界面。表示層的常見形式為WinFrom和WebForm。業(yè)務(wù)邏輯層:負(fù)責(zé)處理用戶輸入的信息,或者是將這些信息發(fā)送給數(shù)據(jù)訪問層進(jìn)行保存,或者是調(diào)用數(shù)據(jù)訪問層中的函數(shù)再次讀出這些數(shù)據(jù)。業(yè)務(wù)邏輯層也可以包括一些對“商業(yè)邏輯”描述代碼在里面。數(shù)據(jù)訪問層:僅實(shí)現(xiàn)對數(shù)據(jù)的保存和讀取操作??梢栽L問數(shù)據(jù)庫系統(tǒng)、二進(jìn)制文件、文本文檔或是XML文檔。
在這一學(xué)期有限的幾次實(shí)驗(yàn)課后,我雖然沒有學(xué)會很多,但也學(xué)會了一些簡單的操作,我學(xué)會了一些簡單的數(shù)據(jù)運(yùn)算,會建立一些簡單的表。有時候在做實(shí)驗(yàn)時,對于實(shí)驗(yàn)中的一些東西我不怎么了解,但我還會去做,因?yàn)槲蚁胫挥卸嗑毩?xí)才能熟練,也才能理解掌握知識。我不知道這一門課對其他同學(xué)來說怎么樣,但對我來說卻有些難,但我會努力。因?yàn)槲艺J(rèn)為它對我以后考計(jì)算機(jī)二級有很大的幫助。
很快這一學(xué)期馬上就要結(jié)束了,數(shù)據(jù)庫這一門課也很快就要結(jié)束了,但這一學(xué)期的學(xué)習(xí)讓我知道了很多,也告訴了我在以后的人生中如何去做事,如何去做人。尤其是老師的耐心,老師的敬業(yè)精神感動了我,再做任何事時都應(yīng)該認(rèn)真負(fù)責(zé),任何一個人都應(yīng)該被尊重。
第五篇:數(shù)據(jù)庫設(shè)計(jì)心得
數(shù)據(jù)庫設(shè)計(jì)經(jīng)驗(yàn)談
數(shù)據(jù)庫設(shè)計(jì)經(jīng)驗(yàn)談
一個成功的管理系統(tǒng),是由:[50% 的業(yè)務(wù) + 50% 的軟件] 所組成,而 50% 的成功軟件又有 [25% 的數(shù)據(jù)庫 + 25% 的程序] 所組成,數(shù)據(jù)庫設(shè)計(jì)的好壞是一個關(guān)鍵。如果把企業(yè)的數(shù)據(jù)比做生命所必需的血液,那么數(shù)據(jù)庫的設(shè)計(jì)就是應(yīng)用中最重要的一部分。有關(guān)數(shù)據(jù)庫設(shè)計(jì)的材料汗牛充棟,大學(xué)學(xué)位課程里也有專門的講述。不過,就如我們反復(fù)強(qiáng)調(diào)的那樣,再好的老師也比不過經(jīng)驗(yàn)的教誨。所以我歸納歷年來所走的彎路及體會,并在網(wǎng)上找了些對數(shù)據(jù)庫設(shè)計(jì)頗有造詣的專業(yè)人士給大家傳授一些設(shè)計(jì)數(shù)據(jù)庫的技巧和經(jīng)驗(yàn)。精選了其中的 60 個最佳技巧,并把這些技巧編寫成了本文,為了方便索引其內(nèi)容劃分為 5 個部分:
第 1 部分設(shè)計(jì)數(shù)據(jù)庫表
總共 24 個指南性技巧,涵蓋表內(nèi)字段設(shè)計(jì)以及應(yīng)該避免的常見問題等。
第 3 部分保證數(shù)據(jù)完整性
討論如何保持?jǐn)?shù)據(jù)庫的清晰和健壯,如何把有害數(shù)據(jù)降低到最小程度。
第 5 部分設(shè)計(jì)數(shù)據(jù)庫之前 考察現(xiàn)有環(huán)境
在設(shè)計(jì)一個新數(shù)據(jù)庫時,你不但應(yīng)該仔細(xì)研究業(yè)務(wù)需求而且還要考察現(xiàn)有的系統(tǒng)。大多數(shù)數(shù)據(jù)庫項(xiàng)目都不是從頭開始建立的;通常,機(jī)構(gòu)內(nèi)總會存在用來滿足特定需求的現(xiàn)有系統(tǒng)(可能沒有實(shí)現(xiàn)自動計(jì)算)。顯然,現(xiàn)有系統(tǒng)并不完美,否則你就不必再建立新系統(tǒng)了。但是對舊系統(tǒng)的研究可以讓你發(fā)現(xiàn)一些可能會忽略的細(xì)微問題。一般來說,考察現(xiàn)有系統(tǒng)對你絕對有好處。
定義標(biāo)準(zhǔn)的對象命名規(guī)范
一定要定義數(shù)據(jù)庫對象的命名規(guī)范。對數(shù)據(jù)庫表來說,從項(xiàng)目一開始就要確定表名是采用復(fù)數(shù)還是單數(shù)形式。此外還要給表的別名定義簡單規(guī)則(比方說,如果表名是一個單詞,別名就取單詞的前 4 個字母;如果表名是兩個單詞,就各取兩個單詞的前兩個字母組成 4 個字母長的別名;如果表的名字由 3 個單詞組成,你不妨從頭兩個單詞中各取一個然后從最后一個單詞中再取出兩個字母,結(jié)果還是組成 4 字母長的別名,其余依次類推)對工作用表來說,表名可以加上前綴 WORK_ 后面附上采用該表的應(yīng)用程序的名字。表內(nèi)的列[字段]要針對鍵采用一整套設(shè)計(jì)規(guī)則。比如,如果鍵是數(shù)字類型,你可以用 _N 作為后綴;如果是字符類型則可以采用 _C 后綴。對列[字段]名應(yīng)該采用標(biāo)準(zhǔn)的前綴和后綴。再如,假如你的表里有好多“money”字段,你不妨給每個列[字段]增加一個 _M 后綴。還有,日期列[字段]最好以 D_ 作為名字打頭。
檢查表名、報(bào)表名和查詢名之間的命名規(guī)范。你可能會很快就被這些不同的數(shù)據(jù)庫要素的名稱搞糊涂了。假如你堅(jiān)持統(tǒng)一地命名這些數(shù)據(jù)庫的不同組成部分,至少你應(yīng)該在這些對象名字的開頭用 Table、Query 或者 Report 等前綴加以區(qū)別。
如果采用了 Microsoft Access,你可以用 qry、rpt、tbl 和 mod 等符號來標(biāo)識對象(比如 tbl_Employees)。我在和 SQL Server 打交道的時候還用過 tbl 來索引表,但我用 sp_company(現(xiàn)在用 sp_feft_)標(biāo)識存儲過程,因?yàn)樵谟械臅r候如果我發(fā)現(xiàn)了更好的處理辦法往往會保存好幾個拷貝。我在實(shí)現(xiàn) SQL Server 2000 時用 udf_(或者類似的標(biāo)記)標(biāo)識我編寫的函數(shù)。
工欲善其事, 必先利其器
采用理想的數(shù)據(jù)庫設(shè)計(jì)工具,比如:SyBase 公司的 PowerDesign,她支持 PB、VB、Delphe 等語言,通過 ODBC 可以連接市面上流行的 30 多個數(shù)據(jù)庫,包括 dBase、FoxPro、VFP、SQL Server 等,今后有機(jī)會我將著重介紹 PowerDesign 的使用。
獲取數(shù)據(jù)模式資源手冊
正在尋求示例模式的人可以閱讀《數(shù)據(jù)模式資源手冊》一書,該書由 Len Silverston、W.H.Inmon 和 Kent Graziano 編寫,是一本值得擁有的最佳數(shù)據(jù)建模圖書。該書包括的章節(jié)涵蓋多種數(shù)據(jù)領(lǐng)域,比如人員、機(jī)構(gòu)和工作效能等。其他的你還可以參考:[1]薩師煊 王珊著 數(shù)據(jù)庫系統(tǒng)概論(第二版)高等教育出版社 1991、[2][美] Steven M.Bobrowski 著 Oracle 7 與客戶/服務(wù)器計(jì)算技術(shù)從入門到精通 劉建元等譯 電子工業(yè)出版社,1996、[3]周中元 信息系統(tǒng)建模方法(下)電子與信息化 1999年第3期,1999 暢想未來,但不可忘了過去的教訓(xùn)
我發(fā)現(xiàn)詢問用戶如何看待未來需求變化非常有用。這樣做可以達(dá)到兩個目的:首先,你可以清楚地了解應(yīng)用設(shè)計(jì)在哪個地方應(yīng)該更具靈活性以及如何避免性能瓶頸;其次,你知道發(fā)生事先沒有確定的需求變更時用戶將和你一樣感到吃驚。
一定要記住過去的經(jīng)驗(yàn)教訓(xùn)!我們開發(fā)人員還應(yīng)該通過分享自己的體會和經(jīng)驗(yàn)互相幫助。即使用戶認(rèn)為他們再也不需要什么支持了,我們也應(yīng)該對他們進(jìn)行這方面的教育,我們都曾經(jīng)面臨過這樣的時刻“當(dāng)初要是這么做了該多好..”。
在物理實(shí)踐之前進(jìn)行邏輯設(shè)計(jì)
在深入物理設(shè)計(jì)之前要先進(jìn)行邏輯設(shè)計(jì)。隨著大量的 CASE 工具不斷涌現(xiàn)出來,你的設(shè)計(jì)也可以達(dá)到相當(dāng)高的邏輯水準(zhǔn),你通常可以從整體上更好地了解數(shù)據(jù)庫設(shè)計(jì)所需要的方方面面。
了解你的業(yè)務(wù)
在你百分百地確定系統(tǒng)從客戶角度滿足其需求之前不要在你的 ER(實(shí)體關(guān)系)模式中加入哪怕一個數(shù)據(jù)表(怎么,你還沒有模式?那請你參看技巧 9)。了解你的企業(yè)業(yè)務(wù)可以在以后的開發(fā)階段節(jié)約大量的時間。一旦你明確了業(yè)務(wù)需求,你就可以自己做出許多決策了。
一旦你認(rèn)為你已經(jīng)明確了業(yè)務(wù)內(nèi)容,你最好同客戶進(jìn)行一次系統(tǒng)的交流。采用客戶的術(shù)語并且向他們解釋你所想到的和你所聽到的。同時還應(yīng)該用可能、將會和必須等詞匯表達(dá)出系統(tǒng)的關(guān)系基數(shù)。這樣你就可以讓你的客戶糾正你自己的理解然后做好下一步的 ER 設(shè)計(jì)。
創(chuàng)建數(shù)據(jù)字典和 ER 圖表
一定要花點(diǎn)時間創(chuàng)建 ER 圖表和數(shù)據(jù)字典。其中至少應(yīng)該包含每個字段的數(shù)據(jù)類型和在每個表內(nèi)的主外鍵。創(chuàng)建 ER 圖表和數(shù)據(jù)字典確實(shí)有點(diǎn)費(fèi)時但對其他開發(fā)人員要了解整個設(shè)計(jì)卻是完全必要的。越早創(chuàng)建越能有助于避免今后面臨的可能混亂,從而可以讓任何了解數(shù)據(jù)庫的人都明確如何從數(shù)據(jù)庫中獲得數(shù)據(jù)。
有一份諸如 ER 圖表等最新文檔其重要性如何強(qiáng)調(diào)都不過分,這對表明表之間關(guān)系很有用,而數(shù)據(jù)字典則說明了每個字段的用途以及任何可能存在的別名。對 SQL 表達(dá)式的文檔化來說這是完全必要的。
創(chuàng)建模式
一張圖表勝過千言萬語:開發(fā)人員不僅要閱讀和實(shí)現(xiàn)它,而且還要用它來幫助自己和用戶對話。模式有助于提高協(xié)作效能,這樣在先期的數(shù)據(jù)庫設(shè)計(jì)中幾乎不可能出現(xiàn)大的問題。模式不必弄的很復(fù)雜;甚至可以簡單到手寫在一張紙上就可以了。只是要保證其上的邏輯關(guān)系今后能產(chǎn)生效益。
從輸入輸出下手
在定義數(shù)據(jù)庫表和字段需求(輸入)時,首先應(yīng)檢查現(xiàn)有的或者已經(jīng)設(shè)計(jì)出的報(bào)表、查詢和視圖(輸出)以決定為了支持這些輸出哪些是必要的表和字段。舉個簡單的例子:假如客戶需要一個報(bào)表按照郵政編碼排序、分段和求和,你要保證其中包括了單獨(dú)的郵政編碼字段而不要把郵政編碼糅進(jìn)地址字段里。
報(bào)表技巧
要了解用戶通常是如何報(bào)告數(shù)據(jù)的:批處理還是在線提交報(bào)表?時間間隔是每天、每周、每月、每個季度還是每年?如果需要的話還可以考慮創(chuàng)建總結(jié)表。系統(tǒng)生成的主鍵在報(bào)表中很難管理。用戶在具有系統(tǒng)生成主鍵的表內(nèi)用副鍵進(jìn)行檢索往往會返回許多重復(fù)數(shù)據(jù)。這樣的檢索性能比較低而且容易引起混亂。
理解客戶需求
看起來這應(yīng)該是顯而易見的事,但需求就是來自客戶(這里要從內(nèi)部和外部客戶的角度考慮)。不要依賴用戶寫下來的需求,真正的需求在客戶的腦袋里。你要讓客戶解釋其需求,而且隨著開發(fā)的繼續(xù),還要經(jīng)常詢問客戶保證其需求仍然在開發(fā)的目的之中。一個不變的真理是:“只有我看見了我才知道我想要的是什么”必然會導(dǎo)致大量的返工,因?yàn)閿?shù)據(jù)庫沒有達(dá)到客戶從來沒有寫下來的需求標(biāo)準(zhǔn)。而更糟的是你對他們需求的解釋只屬于你自己,而且可能是完全錯誤的。
第 2 部分選擇鍵和索引 數(shù)據(jù)采掘要預(yù)先計(jì)劃
我所在的某一客戶部門一度要處理 8 萬多份聯(lián)系方式,同時填寫每個客戶的必要數(shù)據(jù)(這絕對不是小活)。我從中還要確定出一組客戶作為市場目標(biāo)。當(dāng)我從最開始設(shè)計(jì)表和字段的時候,我試圖不在主索引里增加太多的字段以便加快數(shù)據(jù)庫的運(yùn)行速度。然后我意識到特定的組查詢和信息采掘既不準(zhǔn)確速度也不快。結(jié)果只好在主索引中重建而且合并了數(shù)據(jù)字段。我發(fā)現(xiàn)有一個指示計(jì)劃相當(dāng)關(guān)鍵——當(dāng)我想創(chuàng)建系統(tǒng)類型查找時為什么要采用號碼作為主索引字段呢?我可以用傳真號碼進(jìn)行檢索,但是它幾乎就象系統(tǒng)類型一樣對我來說并不重要。采用后者作為主字段,數(shù)據(jù)庫更新后重新索引和檢索就快多了。
可操作數(shù)據(jù)倉庫(ODS)和數(shù)據(jù)倉庫(DW)這兩種環(huán)境下的數(shù)據(jù)索引是有差別的。在 DW 環(huán)境下,你要考慮銷售部門是如何組織銷售活動的。他們并不是數(shù)據(jù)庫管理員,但是他們確定表內(nèi)的鍵信息。這里設(shè)計(jì)人員或者數(shù)據(jù)庫工作人員應(yīng)該分析數(shù)據(jù)庫結(jié)構(gòu)從而確定出性能和正確輸出之間的最佳條件。
使用系統(tǒng)生成的主鍵
這類同技巧 1,但我覺得有必要在這里重復(fù)提醒大家。假如你總是在設(shè)計(jì)數(shù)據(jù)庫的時候采用系統(tǒng)生成的鍵作為主鍵,那么你實(shí)際控制了數(shù)據(jù)庫的索引完整性。這樣,數(shù)據(jù)庫和非人工機(jī)制就有效地控制了對存儲數(shù)據(jù)中每一行的訪問。
采用系統(tǒng)生成鍵作為主鍵還有一個優(yōu)點(diǎn):當(dāng)你擁有一致的鍵結(jié)構(gòu)時,找到邏輯缺陷很容易。
分解字段用于索引
為了分離命名字段和包含字段以支持用戶定義的報(bào)表,請考慮分解其他字段(甚至主鍵)為其組成要素以便用戶可以對其進(jìn)行索引。索引將加快 SQL 和報(bào)表生成器腳本的執(zhí)行速度。比方說,我通常在必須使用 SQL LIKE 表達(dá)式的情況下創(chuàng)建報(bào)表,因?yàn)?case number 字段無法分解為 year、serial number、case type 和 defendant code 等要素。性能也會變壞。假如和類型字段可以分解為索引字段那么這些報(bào)表運(yùn)行起來就會快多了。
鍵設(shè)計(jì) 4 原則
* 為關(guān)聯(lián)字段創(chuàng)建外鍵。* 所有的鍵都必須唯一。* 避免使用復(fù)合鍵。
* 外鍵總是關(guān)聯(lián)唯一的鍵字段。
別忘了索引
索引是從數(shù)據(jù)庫中獲取數(shù)據(jù)的最高效方式之一。95% 的數(shù)據(jù)庫性能問題都可以采用索引技術(shù)得到解決。作為一條規(guī)則,我通常對邏輯主鍵使用唯一的成組索引,對系統(tǒng)鍵(作為存儲過程)采用唯一的非成組索引,對任何外鍵列[字段]采用非成組索引。不過,索引就象是鹽,太多了菜就咸了。你得考慮數(shù)據(jù)庫的空間有多大,表如何進(jìn)行訪問,還有這些訪問是否主要用作讀寫。
大多數(shù)數(shù)據(jù)庫都索引自動創(chuàng)建的主鍵字段,但是可別忘了索引外鍵,它們也是經(jīng)常使用的鍵,比如運(yùn)行查詢顯示主表和所有關(guān)聯(lián)表的某條記錄就用得上。還有,不要索引 memo/note 字段,不要索引大型字段(有很多字符),這樣作會讓索引占用太多的存儲空間。
不要索引常用的小型表
不要為小型數(shù)據(jù)表設(shè)置任何鍵,假如它們經(jīng)常有插入和刪除操作就更別這樣作了。對這些插入和刪除操作的索引維護(hù)可能比掃描表空間消耗更多的時間。
不要把社會保障號碼(SSN)或身份證號碼(ID)選作鍵
永遠(yuǎn)都不要使用 SSN 或 ID 作為數(shù)據(jù)庫的鍵。除了隱私原因以外,須知政府越來越趨向于不準(zhǔn)許把 SSN 或 ID 用作除收入相關(guān)以外的其他目的,SSN 或 ID 需要手工輸入。永遠(yuǎn)不要使用手工輸入的鍵作為主鍵,因?yàn)橐坏┠爿斎脲e誤,你唯一能做的就是刪除整個記錄然后從頭開始。
我在破解他人的程序時候,我看到很多人把 SSN 或 ID 還曾被用做系列號,當(dāng)然盡管這么做是非法的。而且人們也都知道這是非法的,但他們已經(jīng)習(xí)慣了。后來,隨著盜取身份犯罪案件的增加,我現(xiàn)在的同行正痛苦地從一大攤子數(shù)據(jù)中把 SSN 或 ID 刪除。
不要用用戶的鍵
在確定采用什么字段作為表的鍵的時候,可一定要小心用戶將要編輯的字段。通常的情況下不要選擇用戶可編輯的字段作為鍵。這樣做會迫使你采取以下兩個措施:
* 在創(chuàng)建記錄之后對用戶編輯字段的行為施加限制。假如你這么做了,你可能會發(fā)現(xiàn)你的應(yīng)用程序在商務(wù)需求突然發(fā)生變化,而用戶需要編輯那些不可編輯的字段時缺乏足夠的靈活性。當(dāng)用戶在輸入數(shù)據(jù)之后直到保存記錄才發(fā)現(xiàn)系統(tǒng)出了問題他們該怎么想?刪除重建?假如記錄不可重建是否讓用戶走開?
* 提出一些檢測和糾正鍵沖突的方法。通常,費(fèi)點(diǎn)精力也就搞定了,但是從性能上來看這樣做的代價(jià)就比較大了。還有,鍵的糾正可能會迫使你突破你的數(shù)據(jù)和商業(yè)/用戶界面層之間的隔離。
所以還是重提一句老話:你的設(shè)計(jì)要適應(yīng)用戶而不是讓用戶來適應(yīng)你的設(shè)計(jì)。
不讓主鍵具有可更新性的原因是在關(guān)系模式下,主鍵實(shí)現(xiàn)了不同表之間的關(guān)聯(lián)。比如,Customer 表有一個主鍵 CustomerID,而客戶的定單則存放在另一個表里。Order 表的主鍵可能是 OrderNo 或者 OrderNo、CustomerID 和日期的組合。不管你選擇哪種鍵設(shè)置,你都需要在 Order 表中存放 CustomerID 來保證你可以給下定單的用戶找到其定單記錄。
假如你在 Customer 表里修改了 CustomerID,那么你必須找出 Order 表中的所有相關(guān)記錄對其進(jìn)行修改。否則,有些定單就會不屬于任何客戶——數(shù)據(jù)庫的完整性就算完蛋了。如果索引完整性規(guī)則施加到表一級,那么在不編寫大量代碼和附加刪除記錄的情況下幾乎不可能改變某一條記錄的鍵和數(shù)據(jù)庫內(nèi)所有關(guān)聯(lián)的記錄。而這一過程往往錯誤叢生所以應(yīng)該盡量避免。
可選鍵(候選鍵)有時可做主鍵
記住,查詢數(shù)據(jù)的不是機(jī)器而是人。假如你有可選鍵,你可能進(jìn)一步把它用做主鍵。那樣的話,你就擁有了建立強(qiáng)大索引的能力。這樣可以阻止使用數(shù)據(jù)庫的人不得不連接數(shù)據(jù)庫從而恰當(dāng)?shù)倪^濾數(shù)據(jù)。在嚴(yán)格控制域表的數(shù)據(jù)庫上,這種負(fù)載是比較醒目的。如果可選鍵真正有用,那就是達(dá)到了主鍵的水準(zhǔn)。
我的看法是,假如你有可選鍵,比如國家表內(nèi)的 state_code,你不要在現(xiàn)有不能變動的唯一鍵上創(chuàng)建后續(xù)的鍵。你要做的無非是創(chuàng)建毫無價(jià)值的數(shù)據(jù)。如你因?yàn)檫^度使用表的后續(xù)鍵[別名]建立這種表的關(guān)聯(lián),操作負(fù)載真得需要考慮一下了。
別忘了外鍵
大多數(shù)數(shù)據(jù)庫索引自動創(chuàng)建的主鍵字段。但別忘了索引外鍵字段,它們在你想查詢主表中的記錄及其關(guān)聯(lián)記錄時每次都會用到。還有,不要索引 memo/notes 字段而且不要索引大型文本字段(許多字符),這樣做會讓你的索引占據(jù)大量的數(shù)據(jù)庫空間。
第 4 部分各種小技巧 文檔、文檔、文檔
對所有的快捷方式、命名規(guī)范、限制和函數(shù)都要編制文檔。
采用給表、列[字段]、觸發(fā)器等加注釋的數(shù)據(jù)庫工具。是的,這有點(diǎn)費(fèi)事,但從長遠(yuǎn)來看,這樣做對開發(fā)、支持和跟蹤修改非常有用。
取決于你使用的數(shù)據(jù)庫系統(tǒng),可能有一些軟件會給你一些供你很快上手的文檔。你可能希望先開始在說,然后獲得越來越多的細(xì)節(jié)?;蛘吣憧赡芟M芷谛缘念A(yù)排,在輸入新數(shù)據(jù)同時隨著你的進(jìn)展對每一部分細(xì)節(jié)化。不管你選擇哪種方式,總要對你的數(shù)據(jù)庫文檔化,或者在數(shù)據(jù)庫自身的內(nèi)部或者單獨(dú)建立文檔。這樣,當(dāng)你過了一年多時間后再回過頭來做第 2 個版本,你犯錯的機(jī)會將大大減少。
使用常用英語(或者其他任何語言)而不要使用編碼
為什么我們經(jīng)常采用編碼(比如 9935A 可能是?青島啤酒?的供應(yīng)代碼,4XF788-Q 可能是帳目編碼)?理由很多。但是用戶通常都用英語進(jìn)行思考而不是編碼。工作 5 年的會計(jì)或許知道 4XF788-Q 是什么東西,但新來的可就不一定了。在創(chuàng)建下拉菜單、列表、報(bào)表時最好按照英語名排序。假如你需要編碼,那你可以在編碼旁附上用戶知道的英語。
保存常用信息
讓一個表專門存放一般數(shù)據(jù)庫信息非常有用。我常在這個表里存放數(shù)據(jù)庫當(dāng)前版本、最近檢查/修復(fù)(對 FoxPro)、關(guān)聯(lián)設(shè)計(jì)文檔的名稱、客戶等信息。這樣可以實(shí)現(xiàn)一種簡單機(jī)制跟蹤數(shù)據(jù)庫,當(dāng)客戶抱怨他們的數(shù)據(jù)庫沒有達(dá)到希望的要求而與你聯(lián)系時,這樣做對非客戶機(jī)/服務(wù)器環(huán)境特別有用。
測試、測試、反復(fù)測試
建立或者修訂數(shù)據(jù)庫之后,必須用用戶新輸入的數(shù)據(jù)測試數(shù)據(jù)字段。最重要的是,讓用戶進(jìn)行測試并且同用戶一道保證你選擇的數(shù)據(jù)類型滿足商業(yè)要求。測試需要在把新數(shù)據(jù)庫投入實(shí)際服務(wù)之前完成。
檢查設(shè)計(jì)
在開發(fā)期間檢查數(shù)據(jù)庫設(shè)計(jì)的常用技術(shù)是通過其所支持的應(yīng)用程序原型檢查數(shù)據(jù)庫。換句話說,針對每一種最終表達(dá)數(shù)據(jù)的原型應(yīng)用,保證你檢查了數(shù)據(jù)模型并且查看如何取出數(shù)據(jù)。
Microsoft Visual FoxPro 設(shè)計(jì)技巧
對復(fù)雜的 Microsoft Visual FoxPro 數(shù)據(jù)庫應(yīng)用程序而言,可以把所有的主表放在一個數(shù)據(jù)庫容器文件里,然后增加其他數(shù)據(jù)庫表文件和裝載同原有數(shù)據(jù)庫有關(guān)的特殊文件。根據(jù)需要用這些文件連接到主文件中的主表。比如數(shù)據(jù)輸入、數(shù)據(jù)索引、統(tǒng)計(jì)分析、向管理層或者政府部門提供報(bào)表以及各類只讀查詢等。這一措施簡化了用戶和組權(quán)限的分配,而且有利于應(yīng)用程序函數(shù)(存儲過程)的分組和劃分,從而在程序必須修改的時候易于管理。