多語言資料庫設計
⑴ 急!求個資料庫課程的設計!!
《資料庫原理及應用》課程設計
資料庫原理課程設計任務書
一、目的
1. 掌握計算機管理信息系統設計的一般方法,主要包括系統分析、系統設計的組織和實施。
2. 關系型資料庫管理系統的編程技術,並能獨立完成一般小系統的程序設計、調試運行等工作。
3. 培養把所學知識運用到具體對象,並能求出解決方案的能力。
二、任務(任選其一)
A.運用關系型資料庫管理系統,實現本院圖書館管理信息系統。具體要求如下:
—圖書、資料的登記、注銷和查詢。
—借書證管理,包括申請、注銷借書證,查詢借書證持有人等。
—借還圖書、資料的登記、超期處理,超期拒借等。
—圖書、資料查詢,借、還圖書和資料情況查詢。
—圖書、資料借閱情況的統計分析,拒此作為圖書館圖書、資料訂夠的依據之一。(本項不作為基本要求)
B. 運用關系型資料庫管理系統,實現服務電話管理系統
向客戶現場派技術人員的服務公司可以用服務電話管理系統跟蹤客戶、員工、工作訂單、發票、付款等等。
要求:
資料庫要存儲以下信息:
—客戶信息
—客戶工需單信息
—完成工需單所需人工
—完成工需單所需部件
—部件信息
—付款信息
—雇員信息
完成的功能:
—輸入/查看 客戶工需單信息
—輸入/查看部件、雇員等其它信息
—付款
—列印發票等
三、結果形式
1. 設計報告:含E-R圖、數據字典、關系模式、關系實例、查詢描述、關系代數、sql實現的查詢語言及查詢結果。
2. 上機實現。
四、考核
1. 課程設計態度(20分)。
2. 遞交的書面材料(40分)。
3. 上機運行情況(40分)
目錄
1.問題描述 2
1.1背景 2
1.2數據需求 2
1.3事物需求 3
1.4關系模式 3
2.方案圖表設計 3
2.1 E-R圖 3
2.2數據流程圖 8
2.3數據字典 9
2.4關系圖: 11
3.資料庫源代碼 12
3.1資料庫建立 12
3.2數據初始化 14
4.結果數據處理 17
4.1單表查詢 17
4.2超期處理 19
4.3還書操作 20
4.4借書操作 22
4.5書籍狀態 24
4.6讀者狀態 24
5.結束語 26
5.1課程設計心得 26
1.問題描述
1.1背景
隨著圖書館規模的不斷擴大,圖書數量也相應的增加,有關圖書的各種信息量也成倍增加,面對著龐大的信息量,傳統的人工方式管理會導致圖書館管理上的混亂,人力與物力過多浪費,圖書館管理費用的增加,從而使圖書館的負擔過重,影響整個圖書館的運作和控制管理,因此,必須制定一套合理、有效,規范和實用的圖書管理系統,對圖書資料進行集中統一的管理。
另一方面,IT產業和Internet獲得了飛速發展,計算機應用已滲透到了各個領域,引起信息管理的革命,實現了信息的自動化處理,提高了處理的及時性和正確性。
提高圖書管理工作效率,作到信息的規范管理,科學統計和快速查詢,讓圖書館更好的為學校,社會服務。
1.2數據需求
圖書館管理信息系統需要完成功能主要有:
1. 讀者基本信息的輸入,包括借書證編號、讀者姓名、讀者性別。
2.讀者基本信息的查詢、修改,包括讀者借書證編號、讀者姓名、讀者性別等。
3.書籍類別標準的制定、類別信息的輸入,包括類別編號、類別名稱。
4.書籍類別信息的查詢、修改,包括類別編號、類別名稱。
5.書籍庫存信息的輸入,包括書籍編號、書籍名稱、書籍類別、作者姓名、出版社名稱、出版日期、登記日期。
6.書籍庫存信息的查詢,修改,包括書籍編號、書籍名稱、書籍類別、作者姓名、出版社名稱、出版日期登記日期等。
7.借書信息的輸入,包括讀者借書證編號、書籍編號、借書日期。
8.借書信息的查詢、修改,包括借書證編號、讀者編號、讀者姓名、書籍編號、書籍名稱、借書日期等。
9.還書信息的輸入,包括借書證編號、書籍編號、還書日期。
10.還書信息的查詢和修改,包括還書讀者借書證編號、讀者姓名、書籍編號、書籍名稱、借書日期、還書日期等。
11.超期還書罰款輸入,還書超出期限包括超出期限還書的讀者借書證號,書籍編號,罰款金額。
12.超期還書罰款查詢,刪除,包括讀者借書證編號、讀者姓名、書籍編號、書籍名稱,罰款金額等
1.3事物需求
(1)在讀者信息管理部分,要求:
a.可以查詢讀者信息。
b.可以對讀者信息進行添加及刪除的操作。
(2 )在書籍信息管理部分,要求:
a.可以瀏覽書籍信息,要求:
b.可以對書籍信息進行維護,包括添加及刪除的操作。
(3)在借閱信息管理部分,要求:。
a.可以瀏覽借閱信息。
b.可以對借閱信息進行維護操作。
(4)在歸還信息管理部分,要求:
a.可以瀏覽歸還信息
b.對歸還信息可修改維護操作
(5)在管理者信息管理部分,要求:
a.顯示當前資料庫中管理者情況。
b.對管理者信息維護操作。
(6)在罰款信息管理部分,要求:
a.可以瀏覽罰款信息
b.對罰款信息可以更新
1.4關系模式
(一) 書籍類別(種類編號,種類名稱)
(二) 讀者(借書證編號,讀者姓名,讀者性別,讀者種類,登記時期)
(三) 書籍(書籍編號,書籍名稱,書籍類別,書記作者,出版社名稱,出版日期,登記日期)
(四) 借閱(借書證編號,書籍編號,讀者借書時間)
(五) 還書(借書證編號,書籍編號,讀者還書時間)
(六) 罰款(借書證編號,讀者姓名,借書證編號,書籍編號,讀者借書時間)
以上通過關系代數方法的進行運算得到所需要的結果,在實驗結果中可以看到。
2.方案圖表設計
2.1 E-R圖
根據1)所要實現的功能設計,可能建立它們之間的關系,進而實現邏輯結構功能。
圖書管理信息系統可以劃分的實體有:書籍類別信息實體、讀者信息實體、書籍信息實體、借閱記錄信息實體,歸還記錄信息實體。用E-R圖一一描述這些實體。
2.1.1類別實體E-R圖:
圖2-1類別實體E-R圖
2.1.2讀者信息實體E-R圖:
圖2-2 讀者信息實體E-R圖
2.1.3信息實體E-R圖:
圖2-3信息實體E-R圖
2.1.4.記錄信息實體E-R圖:
圖2-4 記錄信息實體E-R圖
2.1.5記錄信息實體E-R圖:
圖2-5記錄信息實體E-R圖
2.1.6罰款信息實體E-R圖:
圖2-6罰款信息實體E-R圖
2.1.6總的信息實體E-R圖:
圖2-7總的信息實體E-R圖
2.2數據流程圖
D5
歸還信息錄入 基本信息錄入
D2
D1
基本信息錄入 基本信息錄入
D3
D4
借閱信息錄入
讀者信息返回 書籍信息返回
圖2-7系統的數據流程圖
2.3數據字典
表2-1 book_sytle 書籍類別信息表
表中列名 數據類型 可否為空 說明
bookstyleno varchar not null(主鍵) 種類編號
bookstyle Varchar not null 種類名稱
表2-2 system_readers讀者信息表格
表中列名 數據類型 可否為空 說明
readerid varchar not null(主鍵) 讀者借書證號
readername varchar not null 讀者姓名
readersex varchar not null 讀者性別
readertype varchar null 讀者種類
regdate datetime null 登記日期
表2-3 system_book書籍信息表
表中列名 數據類型 可否為空 說明
bookid Varchar Not null(主鍵) 書籍編號
bookname Varchar Not null 書籍名稱
bookstyle Varchar Not null 書籍類別
bookauthor Varchar Not null 書籍作者
bookpub Varchar Null 出版社名稱
bookpubdate Datetime Null 出版日期
bookindate Datetime Null 登記日期
isborrowed Varchar Not Null 是否被借出
表2-4 borrow_record 借閱記錄信息表
表中列名 數據類型 可否為空 說明
readerid Varchar Not null(外主鍵) 讀者借閱證編號
bookid Varchar Not null(外主鍵) 書籍編號
borrowdate Varchar Not null 讀者借書時間
表2-5 return_record 借閱記錄信息表
表中列名 數據類型 可否為空 說明
readername Varchar Not null(外主鍵) 讀者借閱證編號
readerid Varchar Not null(外主鍵) 書籍編號
returndate datetime Not null 讀者還書時間
表2-6 reader_fee 罰款記錄信息表
readerid varchar Not null 讀者借書證編號
readername varchar Not null 讀者姓名
bookid varchar Not null(外主鍵) 書籍編號
bookname varchar Not null 書籍名稱
bookfee varchar Not Null 罰款金額
borrowdate datetime Not Null 借閱時間
2.4關系圖:
圖2-8資料庫存表關系圖
3.資料庫源代碼
3.1資料庫建立
3.1.1創建資料庫
USE master
GO
CREATE DATABASE librarysystem
ON
( NAME = librarysystem,
FILENAME = 'd:\librarysystem.mdf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5 )
LOG ON
( NAME = 'library',
FILENAME = 'd:\librarysystem.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB )
GO
3.1.2書本類別表建立
create table book_style
(
bookstyleno varchar(30) primary key,
bookstyle varchar(30)
)
3.1.3創建書庫表
create table system_books
(
bookid varchar(20) primary key,
bookname varchar(30) Not null,
bookstyleno varchar(30) Not null,
bookauthor varchar(30),
bookpub varchar(30) ,
bookpubdate datetime,
bookindate datetime ,
isborrowed varchar (2) ,
foreign key (bookstyleno) references book_style (bookstyleno),
)
3.1.4借書證表建立
create table system_readers
( readerid varchar(9)primary key,
readername varchar(9)not null ,
readersex varchar(2) not null,
readertype varchar(10),
regdate datetime
)
3.1.5借書記錄表建立
create table borrow_record
( bookid varchar(20) primary key,
readerid varchar(9),
borrowdate datetime,
foreign key (bookid) references system_books(bookid),
foreign key (readerid) references system_readers(readerid),
)
3.1.6還書記錄表建立
create table return_record
( bookid varchar(20) primary key,
readerid varchar(9),
returndate datetime,
foreign key (bookid) references system_books(bookid),
foreign key (readerid) references system_readers(readerid)
)
3.1.7罰款單表建立*/
create table reader_fee
( readerid varchar(9)not null,
readername varchar(9)not null ,
bookid varchar(20) primary key,
bookname varchar(30) Not null,
bookfee varchar(30) ,
borrowdate datetime,
foreign key (bookid) references system_books(bookid),
foreign key (readerid) references system_readers(readerid)
)
3.2數據初始化
3.2.1將書籍類別加入表book_style中
insert into book_style(bookstyleno,bookstyle)values('1','人文藝術類')
insert into book_style(bookstyleno,bookstyle)values('2','自然科學類')
insert into book_style(bookstyleno,bookstyle)values('3','社會科學類')
insert into book_style(bookstyleno,bookstyle)values('4','圖片藝術類')
insert into book_style(bookstyleno,bookstyle)values('5','政治經濟類')
insert into book_style(bookstyleno,bookstyle)values('6','工程技術類')
insert into book_style(bookstyleno,bookstyle)values('7','語言技能類')
3.2.2將已有的圖書加入system_books表中(定義相同的作者出版社的書本編號不一樣)
insert
into system_books(bookid ,bookname, bookstyleno,bookauthor,bookpub,bookpubdate, bookindate, isborrowed )
values('00125415152','計算機組成原理','6','王愛英','清華大學出版社','2001-01-03','2003-11-15','1');
insert
into system_books(bookid ,bookname, bookstyleno,bookauthor,bookpub,bookpubdate, bookindate, isborrowed )
values('00125415153','計算機組成原理','6','王愛英','清華大學出版社','2001-01-03','2003-11-15','1');
insert
into system_books(bookid ,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed )
values('00456456','資料庫原理','6','薩師煊','高等教育出版社','2007-07-02','2007-09-15','1');
insert
into system_books(bookid ,bookname, bookstyleno,bookauthor,bookpub,bookpubdate, bookindate, isborrowed )
values('12215121','C程序設計','6','譚浩強','清華大學出版社','2002-04-02','2004-03-14','1');
insert
into system_books(bookid ,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed )
values('9787308020558','計算機體系結構','6','石教英','浙江大學出版社','2004-10-03','2006-11-15','1');
insert
into system_books(bookid ,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed )
values('45456141414','數據結構(c語言版)','6','吳偉民,嚴蔚敏','清華大學出版社','2002-06-28','2004-01-21','1');
insert
into system_books(bookid ,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed )
values('5455515','中華歷史5000年','1','吳強','北京大學出版社','2005-04-03','2006-05-15','1');
insert
into system_books(bookid ,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed )
values('015115','古代埃及','3','趙文華','北京大學出版社','2001-02-02','2002-09-15','1');
insert
into system_books(bookid ,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed )
values('1514514','日本文化','1','吳小鵬','北京大學出版社','2002-04-02','2004-03-14','1');
insert
into system_books(bookid ,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed )
values('15154656','微觀經濟學','5','李小剛','北京大學出版社','2000-10-03','2001-11-15','1');
insert
into system_books(bookid ,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed )
values('5658','影視文學','4','蘇慶東','北京大學出版社','1999-02-28','2000-01-21','1');
insert into
system_books(bookid ,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed )
values('565800020','探索宇宙奧秘','2','蘇慶東','北京大學出版社','1999-02-28','2000-01-21','1');
3.2.3將已有圖書證的讀者加入system_readers表中*/
insert into system_readers(readerid,readername,readersex,readertype,regdate)
values('X05620207','陳遠鵬','男','學生','2005-9-23 14:23:56')
insert into system_readers(readerid,readername,readersex,readertype,regdate)
values('X05620206','陳特','男','學生','2005-09-30 13:24:54.623')
insert into system_readers(readerid,readername,readersex,readertype,regdate)
values('X05620204','趙銘靜','女','學生','2005-09-27 11:24:54.123')
insert into system_readers(readerid,readername,readersex,readertype,regdate)
values('X05620202','潘虹','女','學生','2005-09-30 13:24:54.473')
insert into system_readers(readerid,readername,readersex,readertype,regdate)
values('008415','蔣偉','男','教師','2004-04-30 09:24:54.478')
insert into system_readers(readerid,readername,readersex,readertype,regdate)
values('001456','李葉風','女','教師','2004-04-30 09:24:54.478')
3.2.4添加已借書讀者的記錄,同時將在已借出的借閱標記置0*/
insert into borrow_record(bookid,readerid,borrowdate)
values('00125415152','X05620202','2007-09-27 11:24:54.123')
update system_books
set isborrowed=0
where bookid='00125415152'
insert into borrow_record(bookid,readerid,borrowdate)
values('00125415153','X05620206','2007-12-27 08:26:51.452')
update system_books
set isborrowed=0
where bookid='00125415153' and isborrowed='1'
insert into borrow_record(bookid,readerid,borrowdate)
values('5455515','X05620207','2007-12-27 08:26:51.452')
update system_books
set isborrowed=0
where bookid='5455515' and isborrowed='1'
insert into borrow_record(bookid,readerid,borrowdate)
values('015115','X05620204','2007-10-21 12:11:51.452')
update system_books
set isborrowed=0
where bookid='015115' and isborrowed='1'
insert into borrow_record(bookid,readerid,borrowdate)
values('15154656','001456','2007-12-28 14:11:51.312')
update system_books
set isborrowed=0
where bookid='15154656' and isborrowed='1'
insert into borrow_record(bookid,readerid,borrowdate)
values('565800020','008415','2007-08-28 15:11:31.512')
update system_books
set isborrowed=0
where bookid='565800020' and isborrowed='1'
4.結果數據處理
4.1單表查詢
4.1.1表book_style中查詢演示:
圖4-1 表book_style中內容
4.1.2表system_books中查詢演示:
圖4-2 表system_books中內容
4.1.3將已有圖書證的讀者加入system_readers表中結果查詢:
圖4-3 表system_readers中內容
4.1.4借書紀錄表borrow_record結果查詢:
圖4-4 表borrow_record中內容
4.2超期處理
4.2.1現在對已有借書證的讀者進行查詢借書是否超期(這里歸定30天):
說明:當前的getdate()以日期為2008年1月6日計算
圖4-4 選出借出超過30天的讀者
4.2.2同時也可以用語句超過天數的讀者進行罰款,加入到罰款單裡面,一天以0.3元扣除計算:
SQL語言:
insert into reader_fee(readerid,readername,bookid,bookname,bookfee,borrowdate)
select system_readers.readerid 讀者借書證編號 ,readername 讀者姓名,
system_books.bookid 書籍編號,bookname 書名,
0.3*(Datediff(day,convert(smalldatetime,borrowdate),getdate())-30) 超過時間天數,
borrowdate 借書時間
from borrow_record ,system_readers ,system_books
where system_readers.readerid=borrow_record.readerid
and system_books.bookid=borrow_record.bookid
and Datediff(day,convert(smalldatetime,borrowdate),getdate())>=30
(所影響的行數為 3 行)
select readerid 書讀者借書證編號,readername 讀者姓名,
bookid 書籍編號,bookfee 超期罰款
from reader_fee
形成各本書對應的罰款金額,按0.3元每天算
圖4-5查看罰款單
4.3還書操作
4.3.1現在對某一讀者進行還書操作:
1.首先還書要在還書紀錄中添加一條還書紀錄
2.其次刪除相應書本的借閱紀錄
3.最後在書庫中標記該本書為1,表示歸還了未借,可供其他讀者借閱
說明:學號為X05620207 姓名為陳遠鵬 借閱的565800020書籍編號進行歸還。
SQL語言:
insert into return_record(bookid,readerid,returndate)
select bookid,readerid,getdate()
from borrow_record
where bookid='565800020'
(所影響的行數為 1 行)
delete
from borrow_record
where bookid='565800020'
(所影響的行數為 1 行)
update system_books
set isborrowed=1
where bookid='565800020'
(所影響的行數為 1 行)
三個表的結果如圖:
圖4-6 增加了565800020紀錄
圖4-7 565800020這本書在借書紀錄里沒有了
圖4-8 標記設為了『1』
說明:這本書重新回到未被借出標記為1(注,相同的書其編號是不同的)
其結果為還書成功,相應的各表都有變化,對於罰款單通過借閱記錄表borrow_record中更新。
4.4借書操作
4.4.1查詢未被借出的書本:
圖4-9
4.4.2查詢已被借出的書本:
圖4-10
4.4.3申請借書證:
SQL語言:
Insert into system_readers(readerid,readername,readersex,readertype,regdate)
values('X05620211','小華','男','學生',getdate())
圖4-11
說明:查詢相應的紀錄增加了小華這樣一個讀者的借書證紀錄:
4.4.4注銷借書證:
說明:
1.在注銷之前執行所有的還書過程,就是上面寫到的所述SQL語句,然後執行
delete from system_readers where readerid=' X05620211',
2.小華借書證紀錄就被刪除了,同時要刪除和小華歸還紀錄的內容
delete from return_record where readerid=' X05620211',
4.4.5查詢所有書所對應的類別:
圖4-12
4.5書籍狀態
4.5.1查詢所有工技術類的書:
圖4-13
4.5.2查詢清華大學出版社出版的書:
圖4-14
4.6讀者狀態
4.6.1查詢什麼人借了什麼書:
SQL語言:
select readername 讀者姓名,bookname 書籍名稱
from borrow_record,system_books,system_readers
where system_readers.readerid=borrow_record.readerid
and system_books.bookid=borrow_record.bookid
圖4-15
4.6.2指定潘虹借了什麼書:
SQL語言:
select readername 讀者姓名,bookname 書籍名稱
from borrow_record,system_books,system_readers
where system_readers.readerid=borrow_record.readerid
and system_books.bookid=borrow_record.bookid
and readername='潘虹'
圖4-16
5.結束語
5.1課程設計心得
通過此次資料庫的課程設計,真正達到了學與用的結合,增強了對資料庫方面應用的理解,對自己今後參與開發資料庫系統積累了不少經驗,在實驗過程中,從建立數據開始,對靈據庫設計理念及思想上有更高的認識,從需求分析,到概念設計和邏輯設計,E-R圖的表示,數據字典的創建,懂得了不少有關資料庫開發過程中的知識,在實驗中建表,及其關系模式,關系代數的建立及理解,將SQL語的查詢語句用得淋漓盡致,增強了自己在資料庫中應用SQL語言的靈活性,其中包括,插入、刪除、修改、查詢,牽涉表和表之間的聯系,主建與外主鍵的定義,約束項的設置,使邏輯更嚴密,在學習過程中,我也能過上網查了不少資料,也看了一些別人設計的圖書館管理信息系統的設計報告,學以致用,自我創新,獨立完成了這份自己的報告,從中在學到用,從用又到學,不斷修改,系統更新。雖然不能達到完善系統,但也做到了盡善盡美,加強理論學習對完善系統會有很多幫助,不管怎麼說,對這次做的課程設計自己覺得還算滿意。
⑵ 個位大蝦,做資料庫開發,設計的應該需要那些技能啊,要精通象C#,JAVA...這樣的編程語言嗎_
做資料庫開發,目前幾乎編程語言都支持資料庫,而用的多的資料庫如Oracle,SQL Server,MySQL等.
具體要學習那種語言根據實際需要,只要能掌握一門語言,精通了找工作都沒有問題。
而對於資料庫管理,可能需要懂類似Oracle這類大型復雜的資料庫可能才會好找工作吧。
一點拙見,僅供參考!
⑶ c語言程序資料庫設計
在傍晚的樹叢中的葡萄酒壺,
歡迎你,我的生命,我的死亡和我的命運。
因此我想把它掩埋在我的心裡
讓山峰作為標志留在那裡。
當你小小的心臟開始蘇醒
以為他根本不在乎是不是力氣,哈哈
⑷ 如何實現網站的多語言版本
多語言網站,顧名思義就是能夠以多種語言(而不是單種語言)為用戶提供信息服務,讓使用不同語言的用戶都能夠從同個網站獲得內容相同的信息。
多語言網站實現方案
1,靜態:就是為每種語言分別准備一套頁面文件,要麼通過文件後綴名來區分不同語言,要麼通過子目錄來區分不同語言。
例如對於首頁文件index_en.htm提供英語界面,index_gb.htm提供簡體中文界面,index_big.htm提供繁體中文界面,或者是en/index.htm提供英語界面,gb/index.htm提供簡體中文界面,big/index.htm提供繁體中文界面,一旦用戶選擇了需要的語言後,自動跳轉到相應的頁面,首頁以下其他鏈接也是按照同樣方式處理。從維護的角度來看,通過子目錄比通過文件後綴名來區分不同語言版本顯得要簡單明了。
2,動態:站點內所有頁面文件都是動態頁面文件(PHP,ASP等)而不是靜態頁面文件,在需要輸出語言文字的地方統一採用語言變數來表示,這些語言變數可以根據用戶選擇不同的語言賦予不同的值,從而能夠實現在不同的語言環境下輸出不同的文字。
例如:語言變數ln_name,當用戶選擇的語言是英語時賦值為「Name」,當用戶選擇的語言是簡體中文時賦值為「姓名」,這樣就可以適應不同語言時的輸出。
採用靜態方式的優點是頁面直接輸出到客戶端,不需要在伺服器上運行,佔用伺服器的資源比較少,系統能夠支持的並發連接數較多,缺點是要為每種語言製作一套頁面文件,很多內容即使是和語言無關的也要分不同語言來存儲,因此佔用的存儲空間較多。
採用動態方式和靜態方式的優缺點正好相反,它的優點是動態頁面文件只有一套,不同語言的文字使用語言變數來存儲,和語言無關的內容只存儲一份,佔用的存儲空間較少,並且擴展新語言比較容易,缺點需要在伺服器上運行,然後把結果輸入到客戶端,佔用伺服器的資源比較多,系統能夠支持的並發連接數較少。
動態數據存貯涉及的一些技術問題
由於現在網站上動態應用日益增多,相當多的網站還會使用文件或者資料庫來存儲應用信息,因此如果文件或者資料庫中存儲的內容與語言相關時,還需要特別注意。對於存儲在資料庫中信息,可以採取以下幾種方式支持多語言:
1,在資料庫級別支持多語言:為每種語言建立獨立的資料庫,不同語言的用戶操作不同的資料庫。
2,在表級別支持多語言:為每種語言建立獨立的表,不同語言的用戶操作不同的表,但是它們在同一個資料庫中。
3,在欄位級別支持多語言:在同一個表中為每種語言建立獨立的欄位,不同語言的用戶操作不同的欄位,它們在同一個表中。
由於資料庫中有大量的信息(如標志,編碼,數字等)是用於內部處理使用的,與語言無關的,因此在資料庫級別支持多語言會導致空間的極大浪費,在欄位級別支持多語言最大的問題是一旦需要支持新的語言,由於需要修改表結構,維護起來非常麻煩,可擴展性不好。
相比之下,在表級別支持多語言比較好,因為並不是所有的表都需要支持多語言,對於與語言無關的表,不同語言的用戶共用一套,那些和語言相關的表根據支持語言的種類來建立,不同語言的用戶存取訪問不同的表格。這樣使得維護簡單,節省了存儲空間,即使是擴展起來也比較方便,只要把需要支持多語言的表,多建立一套即可。
還需要注意的問題是:有些表中某些欄位是不同語言版本的表共享的(例如庫存量),由於各種語言的表之間的相對獨立性,使得數據共享有些困難。解決的方法有兩個:
1,不同語言的表的共享欄位同步:也就是說,只要修改了其中一個表的共享欄位,其他語言表中該欄位也作相應改變,實際上當不同語言的用戶同時訪問時處理還是比較麻煩的,並且擴充新語言時修改工作比較大。
2,增加一個新的表:把所有語言共享的欄位(例如貨物編號,產地編碼等)全部放在這個表,支持多語言的表只存放與各種語言相關的欄位。不同語言的用戶在使用資料庫時,需要操作兩個數據表。
比較而言,第二種方法比較簡單,並且效率比較高,維護也比較方便。
應用字元集的選擇
一個定位於不同語言國家的企業網站勢必需要提供多種語言版本的產品和銷售信息來滿足其世界各地使用不同語言的客戶和合作夥伴,其中包括法語、德語、義大利語、葡萄牙語、西班牙語、阿拉伯語等等。但有一個問題卻極易被網站設計者們所忽略。這就是網站的字元集設置問題。
一般我們使用的是簡體中文(GB2312)字元集,而對多語言網站來說,中文字元集卻可能會使你辛辛苦苦的努力功虧一簣。原因很簡單:就是這個毫不起眼的小小字元集在作怪。
計算機應用領域中存在著幾十種互不相同的字元集,而不同語言客戶在瀏覽不同語言網頁時,往往會因為相互間所使用字元集無法兼容而出現亂碼情況。我們在瀏覽國外一些網站時,往往也會出現為了能正常地看到網站上的信息而不得不在各種字元集之間來回切換的情況。
試想一下:如果一個網站提供了中,英,法,德等多種語言版本的內容,內容全之又全,設計美侖美奐。我們在中文編碼環境下瀏覽這些非中文版本的頁面覺得非常完美,現在一個法國客戶對你的產品發生了興趣,當他進到法語版面一看—亂碼多多,甚至可能整個版面都一塌里糊塗。你的網站再下大工夫又有什麼意義呢?
所以對提供了多語言版本的網站來說,Unicode字元集應該是最理想的選擇。它是一種雙位元組編碼機制的字元集,不管是東方文字還是西方文字,在Unicode中一律用兩個位元組來表示,因而至少可以定義65536個不同的字元,幾乎可以涵蓋世界上目前所有通用的語言的每一種字元。 所以在設計和開發多語言網站時,一定要注意先把非中文頁面的字元集定義為「utf-8」格式。
這一步非常重要,原因在於若等頁面做好之後再更改字元集設置,可說是一件非常非常吃力不討好的工作,有時候甚至可能需要從頭再來,重新輸入網站的文字內容。
HTML中的META標簽:
<META HTTP-EQUIV=「Content-Type」 CONTENT=「text/html; CHARSET=字元集">
不寫,根據瀏覽器默認字元集顯示
charset=gb2312 簡體中文
charset=big5 繁體中文
charset=EUC_KR 韓語
charset=Shift_JIS 或 EUC_JP 日語
charset= KOI8-R / Windows-1251 俄語
charset=iso-8859-1 西歐語系(荷蘭語,英語,法語,德語,義大利語,挪威語,葡萄牙語,瑞士語.等十八種語言) http://www.microsoft.com/
charset=iso-8859-2 中歐語系
charset=iso-8859-5 斯拉夫語系(保加利亞語,Byelorussian語,馬其頓語,俄語,塞爾維亞語,烏克蘭語等)
charset=uft-8 unicode多語言
ASP與腳本引擎頁碼的概念
由於我們傳統使用的內碼像Big5,GB2312與unicode並不是一一對應,故兩者之間的轉換要靠codepage(頁碼)來實現
<%@ Language=VBScript CodePage=xxx%>
不寫,根據伺服器端解析引擎默認代碼頁自動解析並返回瀏覽器。
如果製作的網頁腳本與WEB服務端的默認代碼頁不同,則必須指明代碼頁:
codepage=936 簡體中文GBK
codepage=950 繁體中文BIG5
codepage=437 美國/加拿大英語
codepage=932 日文
codepage=949 韓文
codepage=866 俄文
codepage=65001 unicode UFT-8
建議採用utf8的靜態和動態文檔。即:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
⑸ 在資料庫設計過程中要注意哪些問題
DB2資料庫的性能與穩定性直接跟資料庫對象的多少、大小有關。如果對象很少,不復雜,那麼就算不怎麼規劃,也能夠達到比較高的性能。如果對象數據比較多、比較大的話,那麼就需要在資料庫設計之前好好的規劃,否則會在很大程度上影響資料庫的性能與穩定性。
一、選擇合適的語言與資料庫字元集。
在企業中部署資料庫的時候,首先需要在操作系統上安裝資料庫。而在安裝資料庫的時候,需要選擇安裝的語言環境。即是以中文狀態下安裝資料庫還是以英文狀態安裝資料庫。如在啟動安裝程序的時,可以利用/i language選項來指定安裝過程中所採用的語言。到目前為止,DB2資料庫已經支持很多種語言。那麼資料庫在安裝過程中,該採用什麼語言呢?筆者建議,只要資料庫管理員有一點英語基礎,最好能夠採用英文語言環境來進行安裝。雖然說現在DB2資料庫的中文語言環境已經設計的比較完善,但是筆者仍然擔心其有一些不知名的漏洞。為此筆者在安裝DB2資料庫的時候,基本上都採用的是英文語言環境來進行安裝。即將語言設置為「EN」,表示英文。提高DB2數據備份與恢復的效率。
另外如果DB2 資料庫中要保存英文以外的數據,或者說用戶會使用不同的字元集訪問資料庫時,還需要在資料庫安裝過程中選擇特定的資料庫字元集。DB2資料庫中的所有字元數據,包括數據字典中的數據,都是存儲在資料庫字元集中的。如果用戶使用不同的字元集訪問資料庫時,資料庫管理員就需要選擇包含所有這些用戶的字元集的超集。只有如此,才能夠確保系統能夠很方便的使用替代字元完成字元的轉換,從而提高資料庫的性能。如果用戶選擇的字元集不對,有可能會出現一些莫名其妙的問題。如一次用戶在安裝資料庫過程中,沒有選擇合適的字元集。雖然在使用的過程中,其存儲中文字元沒有問題。但是當對資料庫採取還原操作時,卻發現還原後的資料庫中有些原來是中文字元的地方,盡然出現了亂碼。這主要就是沒有選擇合適的字元集惹的禍。有時候如果字元集選擇不當的話,從外部數據源(如Excel表格)導入數據的時候,中文數據也會無法順利導入。所以,資料庫管理員在安裝資料庫的時候,需要根據實際企業,來選擇合適的字元集。
二、評估資料庫對象的大小、數量。
DB2資料庫的性能與穩定性直接跟資料庫對象的多少、大小有關。如果對象很少,不復雜,那麼就算不怎麼規劃,也能夠達到比較高的性能。如果對象數據比較多、比較大的話,那麼就需要在資料庫設計之前好好的規劃,否則會在很大程度上影響資料庫的性能與穩定性。其實DB2 資料庫就好像一個倉庫,資料庫中的對象(如索引、數據表、表空間)等等就好像倉庫中的貨物。如果貨物比較少,那麼隨便放放,倉庫都顯得很空曠。貨物尋找起來也會很方便。但是如果貨物數量比較多、比較大,就必須要對其存儲空間進行合理規劃。只有如此才能夠讓倉庫的空間利用率達到最佳狀態。並且貨物的存放有序,在查找起來也特別的方便。筆者這里就以倉庫管理為例,說話該如何做好資料庫對象大小、數量等方便的評估,以及他們對於資料庫性能與穩定性的影響。
1、根據對象大小來規劃存儲空間。在倉庫貨物的擺放上,要根據貨物的大小來規劃存儲空間。或者說要首先防止大的貨物。只有如此空間的利用率才會最高。其實在規劃DB2對象的時候,也是如此。如某些表可能會包含的記錄比較多,屬於大表。此時資料庫管理員就需要考慮,是否將其放置在一個獨立的表空間或者硬碟空間上,以提高數據操作的性能。大表所對應的索引往往也是比較大的。為此在硬體條件允許的情況下,將索引表與數據表分別存放在不同的硬碟上,可以提高資料庫的性能。而對於一些比較小的對象(如數據表),可以將它們存放在一個表空間中。其實這個表空間就好像倉庫中的一個個紙盒子。將小的對象放入到這個「紙盒子」中,不但不佔空間,而且也容易管理。
2、根據對象的使用頻率來規劃存放空間。在倉庫中擺放物品的時候,往往會把近期就要用到的貨物或者頻繁需要用到的東西放在倉庫門口或者容易拿到的地方。如此在拿這些貨物時就會比較便捷,也不會對其他貨物產生影響。對於DB2資料庫中的對象來說,也是這么一回事。可以將那些訪問量比較大的對象,如索引、數據表,存放在性能比較好的硬碟上或者單獨的硬碟中。此時訪問這些數據,就不會與其它對象產生I/O沖突,操作起來速度就會比較快。而將不怎麼用到的對象,存放在一起。由於他們不怎麼被用到,所以即使存放在性能比較低的硬碟上,其對資料庫性能產生的負面影響也是非常有限的。 在DB2資料庫裡面如何更新執行計劃
3、根據類別來存放資料庫對象。在倉庫中存放貨物的時候,還會對其進行分類。然後根據類別來進行存放。這有利於貨物的管理與檢索。其實在資料庫對象存儲空間設計時,也需要考慮這個因素。如現在應用軟體在設計的時候,很多都是根據模塊來設計。那麼在資料庫對象設計時,也需要根據這個模塊來設計存儲的空間。如將同一個模塊的資料庫對象存放在同一個表空間內。不過這可能會跟上面的兩個建立相違背。此時最好是在對象的命名上做文章。如可以根據模塊的不同,分別給資料庫對象取一個相同的前綴或者後綴。如即使同一塊模塊要用到多個表空間,此時就可以給表空間一個相同的前綴。如此在管理資料庫對象的時候,根據表空間的前綴就可以判斷其所屬的模塊了。如果再加上一個後綴來表示其資料庫對象的分類,那麼就更合理了。為此在管理資料庫對象的時候,要執行分類管理。不僅要從技術上對其進行分類,如分為索引、數據表、關鍵字等等。還需要從功能上進行分類,如按應用程序的模塊來進行分類等等。
三、設計好資料庫備份與還原的方案。
在資料庫交付生產使用之後,往往需要進行大量的測試。但是在測試過程中往往又會產生很多的垃圾數據。可是交給企業應用的,肯定是一個干凈的資料庫系統。為此在資料庫設計的時候,就需要想好如果減少測試過程中的垃圾數據。或者採取什麼樣的方式來實現在交互時自動清除垃圾數據的機制。
一般來說,想要一個資料庫備份與還原的方案,減少資料庫測試所產生的垃圾數據。如現在在給企業部署資料庫的時候,往往是先安裝一個干凈的資料庫系統。當然字元集這些需要預先設置好。然後再利用資料庫還原功能將預先定義好的資料庫模型還原出來。
另外有些時候需要兩個方案互為補充。如在資料庫初始化的過程中,採用資料庫還原的方式來創建資料庫對象。但是在應用軟體升級的時候,由於此時已經有了用戶的數據,為此不能夠在使用資料庫還原的方法。而是通過應用程序來執行某些SQL代碼,來調整或者增加部分資料庫對象。無論採用哪一種方式,需要遵循的一個原則就是在給企業創建資料庫對象時要最大限度的減少測試。而要做到這一點,就是需要先在測試伺服器上創建對象並測試對象可用。然後直接將相關的SQL代碼在投入使用的資料庫伺服器上執行。
⑹ 軟體開發中有很多資料庫,如何自己設計一個資料庫,不是創建資料庫,而是用開發語言編寫一個資料庫。
建議你先看些開源的資料庫,簡單的推薦sqlite,復雜一些的推薦postgresql,berkeley DB,理論方面建議你看看《資料庫系統實現》這本書,斯坦福寫的,北大翻譯的。
我是看的postgresql源碼,然後在裡面增加一些功能,因為完整的資料庫系統是很復雜的。但是寫個簡單的資料庫系統,只包括數據的頁面管理,不支持並發訪問的話應該還是能夠實現的,查詢語言可以用lex yacc解析,執行計劃定義得簡單一些。
⑺ 數據表設計考慮哪些問題
DB2資料庫的性能與穩定性直接跟資料庫對象的多少、大小有關。如果對象很少,不復雜,那麼就算不怎麼規劃,也能夠達到比較高的性能。如果對象數據比較多、比較大的話,那麼就需要在資料庫設計之前好好的規劃,否則會在很大程度上影響資料庫的性能與穩定性。
一、選擇合適的語言與資料庫字元集。
在企業中部署資料庫的時候,首先需要在操作系統上安裝資料庫。而在安裝資料庫的時候,需要選擇安裝的語言環境。即是以中文狀態下安裝資料庫還是以英文狀態安裝資料庫。如在啟動安裝程序的時,可以利用/i language選項來指定安裝過程中所採用的語言。到目前為止,DB2資料庫已經支持很多種語言。那麼資料庫在安裝過程中,該採用什麼語言呢?筆者建議,只要資料庫管理員有一點英語基礎,最好能夠採用英文語言環境來進行安裝。雖然說現在DB2資料庫的中文語言環境已經設計的比較完善,但是筆者仍然擔心其有一些不知名的漏洞。為此筆者在安裝DB2資料庫的時候,基本上都採用的是英文語言環境來進行安裝。即將語言設置為「EN」,表示英文。提高DB2數據備份與恢復的效率。
另外如果DB2 資料庫中要保存英文以外的數據,或者說用戶會使用不同的字元集訪問資料庫時,還需要在資料庫安裝過程中選擇特定的資料庫字元集。DB2資料庫中的所有字元數據,包括數據字典中的數據,都是存儲在資料庫字元集中的。如果用戶使用不同的字元集訪問資料庫時,資料庫管理員就需要選擇包含所有這些用戶的字元集的超集。只有如此,才能夠確保系統能夠很方便的使用替代字元完成字元的轉換,從而提高資料庫的性能。如果用戶選擇的字元集不對,有可能會出現一些莫名其妙的問題。如一次用戶在安裝資料庫過程中,沒有選擇合適的字元集。雖然在使用的過程中,其存儲中文字元沒有問題。但是當對資料庫採取還原操作時,卻發現還原後的資料庫中有些原來是中文字元的地方,盡然出現了亂碼。這主要就是沒有選擇合適的字元集惹的禍。有時候如果字元集選擇不當的話,從外部數據源(如Excel表格)導入數據的時候,中文數據也會無法順利導入。所以,資料庫管理員在安裝資料庫的時候,需要根據實際企業,來選擇合適的字元集。
二、評估資料庫對象的大小、數量。
DB2資料庫的性能與穩定性直接跟資料庫對象的多少、大小有關。如果對象很少,不復雜,那麼就算不怎麼規劃,也能夠達到比較高的性能。如果對象數據比較多、比較大的話,那麼就需要在資料庫設計之前好好的規劃,否則會在很大程度上影響資料庫的性能與穩定性。其實DB2 資料庫就好像一個倉庫,資料庫中的對象(如索引、數據表、表空間)等等就好像倉庫中的貨物。如果貨物比較少,那麼隨便放放,倉庫都顯得很空曠。貨物尋找起來也會很方便。但是如果貨物數量比較多、比較大,就必須要對其存儲空間進行合理規劃。只有如此才能夠讓倉庫的空間利用率達到最佳狀態。並且貨物的存放有序,在查找起來也特別的方便。筆者這里就以倉庫管理為例,說話該如何做好資料庫對象大小、數量等方便的評估,以及他們對於資料庫性能與穩定性的影響。
1、根據對象大小來規劃存儲空間。在倉庫貨物的擺放上,要根據貨物的大小來規劃存儲空間。或者說要首先防止大的貨物。只有如此空間的利用率才會最高。其實在規劃DB2對象的時候,也是如此。如某些表可能會包含的記錄比較多,屬於大表。此時資料庫管理員就需要考慮,是否將其放置在一個獨立的表空間或者硬碟空間上,以提高數據操作的性能。大表所對應的索引往往也是比較大的。為此在硬體條件允許的情況下,將索引表與數據表分別存放在不同的硬碟上,可以提高資料庫的性能。而對於一些比較小的對象(如數據表),可以將它們存放在一個表空間中。其實這個表空間就好像倉庫中的一個個紙盒子。將小的對象放入到這個「紙盒子」中,不但不佔空間,而且也容易管理。
2、根據對象的使用頻率來規劃存放空間。在倉庫中擺放物品的時候,往往會把近期就要用到的貨物或者頻繁需要用到的東西放在倉庫門口或者容易拿到的地方。如此在拿這些貨物時就會比較便捷,也不會對其他貨物產生影響。對於DB2資料庫中的對象來說,也是這么一回事。可以將那些訪問量比較大的對象,如索引、數據表,存放在性能比較好的硬碟上或者單獨的硬碟中。此時訪問這些數據,就不會與其它對象產生I/O沖突,操作起來速度就會比較快。而將不怎麼用到的對象,存放在一起。由於他們不怎麼被用到,所以即使存放在性能比較低的硬碟上,其對資料庫性能產生的負面影響也是非常有限的。 在DB2資料庫裡面如何更新執行計劃
3、根據類別來存放資料庫對象。在倉庫中存放貨物的時候,還會對其進行分類。然後根據類別來進行存放。這有利於貨物的管理與檢索。其實在資料庫對象存儲空間設計時,也需要考慮這個因素。如現在應用軟體在設計的時候,很多都是根據模塊來設計。那麼在資料庫對象設計時,也需要根據這個模塊來設計存儲的空間。如將同一個模塊的資料庫對象存放在同一個表空間內。不過這可能會跟上面的兩個建立相違背。此時最好是在對象的命名上做文章。如可以根據模塊的不同,分別給資料庫對象取一個相同的前綴或者後綴。如即使同一塊模塊要用到多個表空間,此時就可以給表空間一個相同的前綴。如此在管理資料庫對象的時候,根據表空間的前綴就可以判斷其所屬的模塊了。如果再加上一個後綴來表示其資料庫對象的分類,那麼就更合理了。為此在管理資料庫對象的時候,要執行分類管理。不僅要從技術上對其進行分類,如分為索引、數據表、關鍵字等等。還需要從功能上進行分類,如按應用程序的模塊來進行分類等等。
三、設計好資料庫備份與還原的方案。
在資料庫交付生產使用之後,往往需要進行大量的測試。但是在測試過程中往往又會產生很多的垃圾數據。可是交給企業應用的,肯定是一個干凈的資料庫系統。為此在資料庫設計的時候,就需要想好如果減少測試過程中的垃圾數據。或者採取什麼樣的方式來實現在交互時自動清除垃圾數據的機制。
一般來說,想要一個資料庫備份與還原的方案,減少資料庫測試所產生的垃圾數據。如現在在給企業部署資料庫的時候,往往是先安裝一個干凈的資料庫系統。當然字元集這些需要預先設置好。然後再利用資料庫還原功能將預先定義好的資料庫模型還原出來。
另外有些時候需要兩個方案互為補充。如在資料庫初始化的過程中,採用資料庫還原的方式來創建資料庫對象。但是在應用軟體升級的時候,由於此時已經有了用戶的數據,為此不能夠在使用資料庫還原的方法。而是通過應用程序來執行某些SQL代碼,來調整或者增加部分資料庫對象。無論採用哪一種方式,需要遵循的一個原則就是在給企業創建資料庫對象時要最大限度的減少測試。而要做到這一點,就是需要先在測試伺服器上創建對象並測試對象可用。然後直接將相關的SQL代碼在投入使用的資料庫伺服器上執行。
⑻ PHP關於自定義欄位+多語言的網站資料庫設計
首先說明一點,用序列化和JSON不會不安全啊,數據安不安全取決於你的程序有沒有過濾並且處理好要入庫的數據,一般來說,入庫的數據是需要保證安全的。
對於你這個問題,最好的做法還是欄位擴展,這樣至少搜索速度上不會出現大問題,如果是將所有的數據都放到一個欄位上,就是上面的content欄位,這樣後續並不利於搜索,數據感覺也比較混亂。如果僅僅是多語言實現,單詞之間的對應關系,這樣使用單欄位還是可以的,畢竟數據也不多。
⑼ 如何進行資料庫的設計
資料庫設計(Database Design)是指對於一個給定的應用環境,構造最優的資料庫模式,建立資料庫及其應用系統,使之能夠有效地存儲數據,滿足各種用戶的應用需求(信息要求和處理要求)。
在資料庫領域內,常常把使用資料庫的各類系統統稱為資料庫應用系統。
一、資料庫和信息系統
(1)資料庫是信息系統的核心和基礎,把信息系統中大量的數據按一定的模型組織起來,提供存儲、維護、檢索數據的
功能,使信息系統可以方便、及時、准確地從資料庫中獲得所需的信息。
(2)資料庫是信息系統的各個部分能否緊密地結合在一起以及如何結合的關鍵所在。
(3)資料庫設計是信息系統開發和建設的重要組成部分。
(4)資料庫設計人員應該具備的技術和知識:
資料庫的基本知識和資料庫設計技術
計算機科學的基礎知識和程序設計的方法和技巧
軟體工程的原理和方法
應用領域的知識
二、資料庫設計的特點
資料庫建設是硬體、軟體和干件的結合
三分技術,七分管理,十二分基礎數據
技術與管理的界面稱之為「干件」
資料庫設計應該與應用系統設計相結合
結構(數據)設計:設計資料庫框架或資料庫結構
行為(處理)設計:設計應用程序、事務處理等
結構和行為分離的設計
傳統的軟體工程忽視對應用中數據語義的分析和抽象,只要有可能就盡量推遲數據結構設計的決策早期的資料庫設計致力於數據模型和建模方法研究,忽視了對行為的設計
如圖:
三、資料庫設計方法簡述
手工試湊法
設計質量與設計人員的經驗和水平有直接關系
缺乏科學理論和工程方法的支持,工程的質量難以保證
資料庫運行一段時間後常常又不同程度地發現各種問題,增加了維護代價
規范設計法
手工設計方
基本思想
過程迭代和逐步求精
規范設計法(續)
典型方法:
(1)新奧爾良(New Orleans)方法:將資料庫設計分為四個階段
S.B.Yao方法:將資料庫設計分為五個步驟
I.R.Palmer方法:把資料庫設計當成一步接一步的過程
(2)計算機輔助設計
ORACLE Designer 2000
SYBASE PowerDesigner
四、資料庫設計的基本步驟
資料庫設計的過程(六個階段)
1.需求分析階段
准確了解與分析用戶需求(包括數據與處理)
是整個設計過程的基礎,是最困難、最耗費時間的一步
2.概念結構設計階段
是整個資料庫設計的關鍵
通過對用戶需求進行綜合、歸納與抽象,形成一個獨立於具體DBMS的概念模型
3.邏輯結構設計階段
將概念結構轉換為某個DBMS所支持的數據模型
對其進行優化
4.資料庫物理設計階段
為邏輯數據模型選取一個最適合應用環境的物理結構(包括存儲結構和存取方法)
5.資料庫實施階段
運用DBMS提供的數據語言、工具及宿主語言,根據邏輯設計和物理設計的結果
建立資料庫,編制與調試應用程序,組織數據入庫,並進行試運行
6.資料庫運行和維護階段
資料庫應用系統經過試運行後即可投入正式運行。
在資料庫系統運行過程中必須不斷地對其進行評價、調整與修改
設計特點:
在設計過程中把資料庫的設計和對資料庫中數據處理的設計緊密結合起來將這兩個方面的需求分析、抽象、設計、實現在各個階段同時進行,相互參照,相互補充,以完善兩方面的設計
設計過程各個階段的設計描述:
如圖:
五、資料庫各級模式的形成過程
1.需求分析階段:綜合各個用戶的應用需求
2.概念設計階段:形成獨立於機器特點,獨立於各個DBMS產品的概念模式(E-R圖)
3.邏輯設計階段:首先將E-R圖轉換成具體的資料庫產品支持的數據模型,如關系模型,形成資料庫邏輯模式;然後根據用戶處理的要求、安全性的考慮,在基本表的基礎上再建立必要的視圖(View),形成數據的外模式
4.物理設計階段:根據DBMS特點和處理的需要,進行物理存儲安排,建立索引,形成資料庫內模式
六、資料庫設計技巧
1. 設計資料庫之前(需求分析階段)
1) 理解客戶需求,詢問用戶如何看待未來需求變化。讓客戶解釋其需求,而且隨著開發的繼續,還要經常詢問客戶保證其需求仍然在開發的目的之中。
2) 了解企業業務可以在以後的開發階段節約大量的時間。
3) 重視輸入輸出。
在定義資料庫表和欄位需求(輸入)時,首先應檢查現有的或者已經設計出的報表、查詢和視圖(輸出)以決定為了支持這些輸出哪些是必要的表和欄位。
舉例:假如客戶需要一個報表按照郵政編碼排序、分段和求和,你要保證其中包括了單獨的郵政編碼欄位而不要把郵政編碼糅進地址欄位里。
4) 創建數據字典和ER 圖表
ER 圖表和數據字典可以讓任何了解資料庫的人都明確如何從資料庫中獲得數據。ER圖對表明表之間關系很有用,而數據字典則說明了每個欄位的用途以及任何可能存在的別名。對SQL 表達式的文檔化來說這是完全必要的。
5) 定義標準的對象命名規范
資料庫各種對象的命名必須規范。
2. 表和欄位的設計(資料庫邏輯設計)
表設計原則
1) 標准化和規范化
數據的標准化有助於消除資料庫中的數據冗餘。標准化有好幾種形式,但Third Normal Form(3NF)通常被認為在性能、擴展性和數據完整性方面達到了最好平衡。簡單來說,遵守3NF 標準的資料庫的表設計原則是:「One Fact in One Place」即某個表只包括其本身基本的屬性,當不是它們本身所具有的屬性時需進行分解。表之間的關系通過外鍵相連接。它具有以下特點:有一組表專門存放通過鍵連接起來的關聯數據。
舉例:某個存放客戶及其有關定單的3NF 資料庫就可能有兩個表:Customer 和Order。Order 表不包含定單關聯客戶的任何信息,但表內會存放一個鍵值,該鍵指向Customer 表裡包含該客戶信息的那一行。
事實上,為了效率的緣故,對表不進行標准化有時也是必要的。
2) 數據驅動
採用數據驅動而非硬編碼的方式,許多策略變更和維護都會方便得多,大大增強系統的靈活性和擴展性。
舉例,假如用戶界面要訪問外部數據源(文件、XML 文檔、其他資料庫等),不妨把相應的連接和路徑信息存儲在用戶界面支持表裡。還有,如果用戶界面執行工作流之類的任務(發送郵件、列印信箋、修改記錄狀態等),那麼產生工作流的數據也可以存放在資料庫里。角色許可權管理也可以通過數據驅動來完成。事實上,如果過程是數據驅動的,你就可以把相當大的責任推給用戶,由用戶來維護自己的工作流過程。
3) 考慮各種變化
在設計資料庫的時候考慮到哪些數據欄位將來可能會發生變更。
舉例,姓氏就是如此(注意是西方人的姓氏,比如女性結婚後從夫姓等)。所以,在建立系統存儲客戶信息時,在單獨的一個數據表裡存儲姓氏欄位,而且還附加起始日和終止日等欄位,這樣就可以跟蹤這一數據條目的變化。
欄位設計原則
4) 每個表中都應該添加的3 個有用的欄位
dRecordCreationDate,在VB 下默認是Now(),而在SQL Server • 下默認為GETDATE()
sRecordCreator,在SQL Server 下默認為NOT NULL DEFAULT • USER
nRecordVersion,記錄的版本標記;有助於准確說明記錄中出現null 數據或者丟失數據的原因 •
5) 對地址和電話採用多個欄位
描述街道地址就短短一行記錄是不夠的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的靈活性。還有,電話號碼和郵件地址最好擁有自己的數據表,其間具有自身的類型和標記類別。
6) 使用角色實體定義屬於某類別的列
在需要對屬於特定類別或者具有特定角色的事物做定義時,可以用角色實體來創建特定的時間關聯關系,從而可以實現自我文檔化。
舉例:用PERSON 實體和PERSON_TYPE 實體來描述人員。比方說,當John Smith, Engineer 提升為John Smith, Director 乃至最後爬到John Smith, CIO 的高位,而所有你要做的不過是改變兩個表PERSON 和PERSON_TYPE 之間關系的鍵值,同時增加一個日期/時間欄位來知道變化是何時發生的。這樣,你的PERSON_TYPE 表就包含了所有PERSON 的可能類型,比如Associate、Engineer、Director、CIO 或者CEO 等。還有個替代辦法就是改變PERSON 記錄來反映新頭銜的變化,不過這樣一來在時間上無法跟蹤個人所處位置的具體時間。
7) 選擇數字類型和文本類型盡量充足
在SQL 中使用smallint 和tinyint 類型要特別小心。比如,假如想看看月銷售總額,總額欄位類型是smallint,那麼,如果總額超過了$32,767 就不能進行計算操作了。
而ID 類型的文本欄位,比如客戶ID 或定單號等等都應該設置得比一般想像更大。假設客戶ID 為10 位數長。那你應該把資料庫表欄位的長度設為12 或者13 個字元長。但這額外占據的空間卻無需將來重構整個資料庫就可以實現資料庫規模的增長了。
8) 增加刪除標記欄位
在表中包含一個「刪除標記」欄位,這樣就可以把行標記為刪除。在關系資料庫里不要單獨刪除某一行;最好採用清除數據程序而且要仔細維護索引整體性。
3. 選擇鍵和索引(資料庫邏輯設計)
鍵選擇原則:
1) 鍵設計4 原則
為關聯欄位創建外鍵。 •
所有的鍵都必須唯一。 •
避免使用復合鍵。 •
外鍵總是關聯唯一的鍵欄位。 •
2) 使用系統生成的主鍵
設計資料庫的時候採用系統生成的鍵作為主鍵,那麼實際控制了資料庫的索引完整性。這樣,資料庫和非人工機制就有效地控制了對存儲數據中每一行的訪問。採用系統生成鍵作為主鍵還有一個優點:當擁有一致的鍵結構時,找到邏輯缺陷很容易。
3) 不要用用戶的鍵(不讓主鍵具有可更新性)
在確定採用什麼欄位作為表的鍵的時候,可一定要小心用戶將要編輯的欄位。通常的情況下不要選擇用戶可編輯的欄位作為鍵。
4) 可選鍵有時可做主鍵
把可選鍵進一步用做主鍵,可以擁有建立強大索引的能力。
索引使用原則:
索引是從資料庫中獲取數據的最高效方式之一。95%的資料庫性能問題都可以採用索引技術得到解決。
1) 邏輯主鍵使用唯一的成組索引,對系統鍵(作為存儲過程)採用唯一的非成組索引,對任何外鍵列採用非成組索引。考慮資料庫的空間有多大,表如何進行訪問,還有這些訪問是否主要用作讀寫。
2) 大多數資料庫都索引自動創建的主鍵欄位,但是可別忘了索引外鍵,它們也是經常使用的鍵,比如運行查詢顯示主表和所有關聯表的某條記錄就用得上。
3) 不要索引memo/note 欄位,不要索引大型欄位(有很多字元),這樣作會讓索引佔用太多的存儲空間。
4) 不要索引常用的小型表
不要為小型數據表設置任何鍵,假如它們經常有插入和刪除操作就更別這樣作了。對這些插入和刪除操作的索引維護可能比掃描表空間消耗更多的時間。
4. 數據完整性設計(資料庫邏輯設計)
1) 完整性實現機制:
實體完整性:主鍵
參照完整性:
父表中刪除數據:級聯刪除;受限刪除;置空值
父表中插入數據:受限插入;遞歸插入
父表中更新數據:級聯更新;受限更新;置空值
DBMS對參照完整性可以有兩種方法實現:外鍵實現機制(約束規則)和觸發器實現機制
用戶定義完整性:
NOT NULL;CHECK;觸發器
2) 用約束而非商務規則強制數據完整性
採用資料庫系統實現數據的完整性。這不但包括通過標准化實現的完整性而且還包括數據的功能性。在寫數據的時候還可以增加觸發器來保證數據的正確性。不要依賴於商務層保證數據完整性;它不能保證表之間(外鍵)的完整性所以不能強加於其他完整性規則之上。
3) 強制指示完整性
在有害數據進入資料庫之前將其剔除。激活資料庫系統的指示完整性特性。這樣可以保持數據的清潔而能迫使開發人員投入更多的時間處理錯誤條件。
4) 使用查找控制數據完整性
控制數據完整性的最佳方式就是限制用戶的選擇。只要有可能都應該提供給用戶一個清晰的價值列表供其選擇。這樣將減少鍵入代碼的錯誤和誤解同時提供數據的一致性。某些公共數據特別適合查找:國家代碼、狀態代碼等。
5) 採用視圖
為了在資料庫和應用程序代碼之間提供另一層抽象,可以為應用程序建立專門的視圖而不必非要應用程序直接訪問數據表。這樣做還等於在處理資料庫變更時給你提供了更多的自由。
5. 其他設計技巧
1) 避免使用觸發器
觸發器的功能通常可以用其他方式實現。在調試程序時觸發器可能成為干擾。假如你確實需要採用觸發器,你最好集中對它文檔化。
2) 使用常用英語(或者其他任何語言)而不要使用編碼
在創建下拉菜單、列表、報表時最好按照英語名排序。假如需要編碼,可以在編碼旁附上用戶知道的英語。
3) 保存常用信息
讓一個表專門存放一般資料庫信息非常有用。在這個表裡存放資料庫當前版本、最近檢查/修復(對Access)、關聯設計文檔的名稱、客戶等信息。這樣可以實現一種簡單機制跟蹤資料庫,當客戶抱怨他們的資料庫沒有達到希望的要求而與你聯系時,這樣做對非客戶機/伺服器環境特別有用。
4) 包含版本機制
在資料庫中引入版本控制機制來確定使用中的資料庫的版本。時間一長,用戶的需求總是會改變的。最終可能會要求修改資料庫結構。把版本信息直接存放到資料庫中更為方便。
5) 編制文檔
對所有的快捷方式、命名規范、限制和函數都要編制文檔。
採用給表、列、觸發器等加註釋的資料庫工具。對開發、支持和跟蹤修改非常有用。
對資料庫文檔化,或者在資料庫自身的內部或者單獨建立文檔。這樣,當過了一年多時間後再回過頭來做第2 個版本,犯錯的機會將大大減少。
6) 測試、測試、反復測試
建立或者修訂資料庫之後,必須用用戶新輸入的數據測試數據欄位。最重要的是,讓用戶進行測試並且同用戶一道保證選擇的數據類型滿足商業要求。測試需要在把新資料庫投入實際服務之前完成。
7) 檢查設計
在開發期間檢查資料庫設計的常用技術是通過其所支持的應用程序原型檢查資料庫。換句話說,針對每一種最終表達數據的原型應用,保證你檢查了數據模型並且查看如何取出數據。