PostGIS系列課程之空間約束(一)

2021-10-09 20:43:49 字數 1849 閱讀 1599

約束用於確保資料庫中的資料反映資料模型的假設。

為什麼要在資料庫中而不是在應用程式層實施資料質量規則? 因為如果您在應用程式層限定所有資料,則每當新增「另乙個應用程式」寫入資料庫時,都必須複製「所有邏輯」。

如果您有幸編寫了乙個成功執行了超過兩年的系統,那麼多個寫入應用程式迅速普及的可能性將達到100%。 在資料庫中強制執行核心資料質量規則是一種以可靠的資料完整性假設為基礎的系統的好方法。

空間約束如何實現呢? 得益於postgresql執行時擴充套件的神奇之處,geometry型別只是另一種型別,並且所有約束檢查機制對geometry一樣適用於任何其他型別。

這是空間資料庫使用者喜歡對幾何資料執行的簡單和複雜約束的一些示例。

postgresql列級別的約束允許我們將測試應用於資料,但只能在如下粒度級別上進行:檢查只能對輸入值進行操作,因此我們只能使用相對簡單的測試來檢查單個幾何的屬性。

空間函式比如:

st_area, st_union, st_intersection 所有這些都依賴於「有效幾何圖形」輸入以產生正確的答案,因此許多使用者只希望在**中允許有效幾何圖形。

這是一張包裹表的檢查例子:檢查約束 通過 st_isvalid 強制幾何物件有效性檢查.

create table parcels (

pk bigint primary key,

geom geometry(polygon, 3005)

not null check (st_isvalid(geom)),

pid text not null unique

)

「無效」多邊形是具有以下內容的多邊形:

這是一些無效的多邊形。

使用我們的檢查約束後,有效多邊形的插入成功。

insert into parcels (pk, pid, geom) 

values (1, '12345',

'polygon((0 0, 10 0, 10 10, 0 10, 0 0))'

);

無效多邊形的插入失敗。

insert into parcels (pk, pid, geom) 

values (2, '23456',

'polygon((

160 170, 160 280, 213

315, 310 280, 300 140,

210 220,280 190, 160 170))' );

notice:  self-intersection at or near 

point 249.47368421052633 184.91228070175438

error: new row for relation "parcels"

violates check constraint "parcels_geom_check"

detail: failing row contains (2, 0103000020bd0b00

000100000008000000000000000000644000000000004065...,

23456).

與非空間約束一樣,空間約束也可以用於執行常識性業務規則。 例如:

檢查約束看起來簡單易懂,但空間資料要求進行更強大的質量約束,其中涉及檢視表中的幾何圖形之間以及表之間的結構關係。

為此,我們將需要表級約束和觸發器,我們將在本系列的下一部分中進行討論。

MySQL系列課程之二MySQL資料庫的安裝及配置

1 1 mysql的介紹 1 2 使用rpm方式對mysql進行安裝 1 3 登陸mysql資料庫 1 4 練習 1 1 1 mysql的由來及應用 mysql 1 是乙個關係型資料庫管理系統,由瑞典 mysql ab 公司開發,目前屬於 oracle 旗下公司。mysql 最流行的關係型資料庫管理...

大型系列課程之 七夕告白之旅vbs篇

也許,世間所有的美好的東西,都是需要儀式感的,遇到了一年一度的七夕節,怎麼過這個節日,成了很多心中有愛的人關注的事情,七夕不浪漫,人間不值得,七夕,發源於中國,這個美好的節日,來自動人的神話故事傳說牛郎和織女的淒美愛情,一年一度的鵲橋相會,被我們賦予了太多神秘和唯美,這一天,也被定義為中國的情人節,...

資料結構與演算法系列課程之二 複雜度分析(下)

例項 全域性變數,大小為10的陣列 array,長度 len,下標 i。int array new int 10 int len 10 int i 0 往陣列中新增乙個元素 void add int element new array複製給 array,array現在大小就是2倍 len array...