關於資料庫的邏輯設計,是乙個很廣泛的問題。本文主要針對開發應用中遇到在ms sql server上進行表設計時,對錶的主鍵設計應注意的問題以及相應的解決辦法。
--序列所有者(system_user)
seq_current bigint not null default 0,--序列當前值
seq_min bigint not null default 0,--序列最小值
seq_max bigint not null default 0,--序列最小值
seq_max bigint not null default 0,--序列最大值
seq_stepint not null default 1,--序列增長步長
if_cycleint not null default 0,--是否迴圈(0,不迴圈;1,迴圈)
constraint t_db_seq primary key clustered
(seq_name,seq_owner)--主鍵
)應用系統為需要建立自增列的表建立乙個序列名稱,在表「t_db_seq」中反映為資料庫中的一行。
第一,需要為需要建立序列的表建立乙個序列。採用方法:f_create_seq(序列名)。該函式傳入序列的名稱,在表「t_db_seq」插入一行。序列的所有者,採用系統變數system_user。
第二,獲取下乙個值。採用方法:f_get_next_seq_val(序列名)。該函式根據序列名獲取該序列的下乙個值,根據當前值與增長步長得到。同時,該函式保證在同時獲取同乙個序列時,應保證併發一致性。
第三、將返回值返回到應用使用。
此外,為保證應用的完整性,可能還需要提供一些方法的過載方法,同時提供一些其他方法:
獲取序列當前值:f_get_seq_cur_val(序列名)
設定序列值:f_set_seq_val(序列名)
刪除序列:f_del_seq(序列名)
判斷序列是否存在:f_seq_exists(序列名)
在主從關係的表設計中,子表也使用序列字段作為唯一主鍵,將父表的序列字段作為外來鍵關聯:
以下為引用ic交易網
的內容:
create table t_pk_demo_c
( u_id bigint not null ,--唯一標識記錄的id
col_other varchar(20) not null ,--其他列
p_id int not null ,--父表id
constraint pk_t_pk_demo_c primary key
nonclustered (u_id)--定義為主鍵
constraint fk_t_pk_demo_c foreign key (p_id)
references t_pk_demo(u_id) on delete cascade,
)使用序列的問題及解決辦法由於系統使用乙個額外增加乙個字段作為主鍵,因此沒有為業務邏輯建立主鍵約束。比如在企業使用者資訊表中,要求企業中使用者登入名必須唯一。一般在建立表時,以登入名作為主鍵,這個時候在資料庫層自然的建立另乙個主鍵唯一性約束。而現在沒有使用登入名作為主鍵,那麼就沒有這個約束。解決辦法:
一是在資料庫層解決。可以為該錶建立乙個唯一(unique)約束或者唯一索引。如:
alter table t_pk_demo add constraint c_t_pk_demo unique nonclustered(col_other)-唯一約束
create unique index ix_t_pk_demo on t_pk_demo(col_other) – 唯一索引
ic交易網
二是在應用端解決。也就是在應用中判斷該列是否有重複值,然後根據判斷結果來保證唯一性。
作為非業務欄位的主鍵列,是乙個沒有重複值的、基本不進行更新操作的列。並且,在sql server資料庫中,聚蔟索引在乙個表中只能有乙個。因此,聚蔟索引非常重要,需要留給更重要的字段來使用。因此,對照上表和根據聚蔟索引的重要程度,在此處採用非聚蔟方式建立其索引。
ic交易網
具體應用
採用這種主鍵設計方式,有諸多好處,這已經在前文說明。現在就以乙個具體的應用來說明如何使用這個主鍵。
當前的應用系統基本上都已經採用b/s方式,儘管現在的網路速度已經有大幅度的提高,但是由於在web應用上使用者數量眾多、同時基本上所有的運算都集中在web應用伺服器上,所以在web設計上更要考慮到效能的優化,以減少網路流量和對伺服器的壓力。最常見的乙個應用就是列表方式展現時的分頁方式。一般的,在資料量小的情況下,一般不會怎麼注意這個問題,通常採用將資料完全取出,然後在web伺服器上進行分頁。但是,當資料量龐大時,這種方式就會導致速度降低,甚至根本不可用。所以,一般採用儲存過程,在資料庫端進行分頁。
sybase 儲存過程 快取
最近系統公升級,修改了資料庫的表字段,結果出現了問題,試了很久才找到問題,但還是不知道具體的原因。問題如下 sybase資料庫表tcz,應為業務需要,需在表中加乙個自增字段操作如下 1 停止服務程式,不讓其往資料庫寫入資料。2 把原來的表名改為tcz old 3 新建表tcz,裡面增加id自增字段 ...
Sybase 儲存過程GROUP
版本1 if object id dbo.statistics for ang is not null drop procedure dbo.statistics for ang gocreate procedure statistics for ang begin time date as beg...
sybase 儲存過程 示例
表 student 列 student id,name,age,teacher id 表 teacher 列 teacher id,name,age,salary,student num 需求 將性別和年齡符合給定條件的學生,都指派給指定的老師,並將學生的數量,更新到teacher表中。業務成功,則...