數據庫設計——GIS點數據
我正在考慮是否應該向現有表中添加列或使用新表。該數據庫是關於鳥類、隨時間推移的位置和築巢位置。
我需要儲存的數據是點 (X,Y) 位置數據。該數據將來自 GPS,雖然兩個位置可能非常接近,但我認為即使您認為自己站在同一個位置,兩次獲得相同的 X、Y 的可能性也很小。
第一個表稱為健康檢查(每個健康檢查都與一隻鳥相關,一隻鳥在其一生中有許多健康檢查)。每次進行健康檢查時,都會記錄位置和日期。
第二個表稱為 Nest - 每個巢都有一個位置。巢是不可變的——即它們不會移動。
如何查詢這些數據?
每隻鳥的健康檢查位置 (X,Y) 將隨時間繪製(查詢),以查看鳥的移動位置。
巢位置將一次全部繪製出來(即查詢所有巢位置並繪製它們)。很多時候,可能有 50% 的時間鳥在健康檢查期間的位置將是巢表中巢的位置。
涉及的鳥類數量約為300。db是MySQL。
位置 (XY) 數據是否應該放在自己的表中?
如果需要,我可以提供更多資訊。
將建議將所有位置都放在一個表中,並且有一列數據類型為 char(1),其值為 H(health) 和 L(Location) 以區分位置。這也將幫助您在將來添加更多位置類型。
不,我將 GPS 位置視為數字。如果您使用的是
SPATIAL
索引,請使用POINT()
. 如果不使用SPATIAL
,請參閱此選擇數據類型:http: //mysql.rjweb.org/doc.php/find_nearest_in_mysql#representation_choices嘗試“標準化”點沒有任何優勢。由於 GPS 的不精確性,坐在巢中的鳥可能會或可能不會註冊相同的 (X,Y)。所有操作都必須意識到這種不精確性。
您可能需要另一張表來提供每隻鳥的“最新”位置。“health_check”表給出了歷史記錄,每隻鳥的最新條目與“最新”中的一個條目是多餘的。這將簡化某些操作。
對於繪圖,我認為幾百個“鳥”和“巢”沒有問題。(繪製每隻鳥的整個旅行歷史需要時間並導致幾乎無用的圖表。)
為了發現哪隻鳥在特定的巢穴中(反之亦然),需要數百次距離計算,因此在當今的 CPU 上很實用。(一百萬隻鳥——那將是另一回事。)