分布式資料庫如何實現非主鍵列的唯一約束或唯一索引?

時間 2021-05-07 03:03:51

1樓:朱翀

可以為這個非主鍵列建立乙個分布式表,表名為主表名加該非主鍵列名(table_colum),這個新錶的主鍵就是主表要建立唯一約束的非主鍵列,這樣每次往主表插入資料的時候,都先查詢這張新錶,如果新錶已經存在資料就說明違反唯一約束。

唯一索引的話,就是這張新錶再加一列,這一列存得就是主表的主鍵。使用該唯一索引查詢的話,就是先根據列值,查詢到主表的主鍵值,再根據該主鍵值反查主表,獲取全部的內容。

上面可能說的比較抽象,我舉個例子:

在分布式資料庫上建立一張有唯一索引的表

create table t (a int primary key, b int , c int ) unique key b;

資料庫在建立這張表的同時,建立一張關聯表

create table t_b(b int primary key , a int)

這樣使用者往表t 插入資料時,資料庫相應的往關聯表插入資料

insert into t(a, b, c) values (1, 2 , 2),(2, 6, 7) , (3 , 100, 2);

//資料庫關聯插入 insert into t_b (b , a) values (2,1),(6,2) , (100, 3).

當使用者在插入重複的值時,就可以從關聯表中發現了,同時也可以用關聯表做索引

2樓:三毛

如果題主是在問:「在分布式資料庫中如何生成唯一性id(不一定是主鍵)」 那可以接著往下看。

生成演算法大致可以分為兩類

第一類,集中式生成策略。也就是先在分布式資料庫的一張表中,預先生成很多很多id,通過這張表的唯一性索引約束保證生成的id都是唯一的。那麼接下來的工作就很好辦了,每次寫入的時候,都會從那張表中取乙個batch的id(用完之前不需要再取),然後可能會拼接上一些時間,機器標識,然後就可以作為唯一id使用了。

國內很多公司,比如阿里都是用的這個方法。

第二類,去中心化生成策略。去中心化的意思就是不需要在固定的乙個表裡預先生成,而是由每一張表各自生成。比較典型的演算法有UUID和facebook的snowflake。

思想都是一樣的,就是各種欄位的拼接,使得不同機器生成的id不可能相同。比如UUID用到了太網絡卡位址、納秒級時間、晶元ID碼和隨機數等等字段。

上面兩類演算法有各自的優勢和劣勢,也有各自的優化空間,需要結合具體的業務場景來使用。

3樓:申礫

簡單來說就是寫入的時候檢查相同值的資料是否已經存在,存在的話就報錯。工程實現上可以做各種優化,比如 batch 檢查之類的。這裡是 TiDB 原始碼中最簡單場景的實現:

分布式資料庫的分布式事務?

NebulaGraph 業務系統往往是通過子系統組合的模式來完成,這些子系統很可能是不同的資料庫,甚至可能是 友商 的,互相直接無法保證事務,還是得業務自身保證。 codingfor 你說的單機事物,我的理解其實是指single threaded excution,而不是指在單台機器上做事物 暗含了...

為什麼分布式資料庫這麼喜歡用kv store?

NebulaGraph 採用鍵值對儲存主要還是出於資料模型和效能角度考慮的。目前比較流行的方案有 Google 開源的 LevelDB 和 FaceBook 開源的 RocksDB。鍵值型儲存模型比較簡單,LSM 模型將隨機寫轉換為順序寫,在隨機讀方面也可以優化,效能比較有保障。分布式系統往往根據 ...

在分布式資料庫儲存中,資料分割槽和資料放置有什麼區別?

楊東東 資料分割槽和資料放置是邏輯和物理的關係,邏輯是頂層設計,物理是具體實現,邏輯設計決定物理實現,物理約束反過來影響邏輯設計。舉個例子,給你10個桌球,要求放入3個盒子裡。如何決定哪個球放入哪個盒子?比如 按照編號大小 0 2放入盒子A,3 5放入盒子B,6 9放入盒子C 按照編號特徵 對3取餘...