關於採番表設計

對於業務表,基本上都會給主鍵一個編號,尤其是主從表的時候,從表往往是根據主表的主鍵關聯的。

在mysql裏通常用一個自增字段做這個編號,但是自增字段有個問題就是不大好管理,尤其是數據庫重啓,或者遷移的時候。

如果一個表的自增字段毫無業務意義,即使在維護數據庫的時候,對這個字段進行重拍,都不會影響業務的話,那麼就沒啥問題。

但像上面所說,還有其他表參照這個字段的話,那麼這個字段最好是自己採番,而不是要依賴於數據庫的動作。

 

1種方法是採番用UUID,這樣即使是在分佈式數據庫時都可以用,但是同樣有小概率重複,如果是單機的話,也沒必要。

另外一種方法,就是設計一個採番數據庫了,設計一個最簡單的採番數據庫。

drop table if exists numbering;
create table numbering (
    table_name varchar(20) primary key,
    id bigint(20) unsigned not null
) engine=innodb;

 以表爲單位進行id管理,先初始化這個表

insert into numbering (table_name, id)values('users',0);

 

然後每次通過更新這個採番表,來取得新的id值

update numbering set id = last_insert_id(id + 1) where table_name = 'users';
select last_insert_id();

 

爲了提高性能,要把這個id取得的處理放到一個單獨的事務中去。

當然同樣的,如果後續處理失敗,再取得時,那就是新的id了,也就是id會不連續。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章