保存方法徹底比較!MySQLデータベースにおける緯度/経度とGEOMETRY型の関係
MySQLデータベースに緯度/経度を保存する際のデータ型
DOUBLE型
- 数値型で、小数点以下の桁数を指定できます。
- 緯度/経度の精度をある程度保ちたい場合に適しています。
- 範囲は-1.7976931348623157E+308から1.7976931348623157E+308までです。
- 多くの場合、
DOUBLE(9,6)
(小数点以下6桁) が推奨されます。
FLOAT型
DOUBLE
型よりも精度が低く、メモリ使用量も少ない数値型です。- 範囲は-3.4028234663852886E+38から3.4028234663852886E+38までです。
FLOAT(7,4)
(小数点以下4桁) が一般的です。
DECIMAL型
- 固定小数点数の数値型です。
- 範囲は-10^38-1から10^38-1までです。
DECIMAL(10,6)
(小数点以下6桁) などの形式で指定できます。
GEOMETRY型
- 空間データ型で、点、線、ポリゴンなどの形状を保存できます。
- 緯度/経度だけでなく、高度などの情報も一緒に保存したい場合に適しています。
- MySQL 8.0以降でサポートされています。
TEXT型
- 文字列型です。
- ただし、
DOUBLE
型などの数値型と比べて、データの比較や検索が遅くなる可能性があります。
どのデータ型を選ぶべきか
上記のデータ型の中から、具体的な状況に応じて適切なものを選ぶ必要があります。
- 緯度/経度の精度をある程度保ちたい場合は、
DOUBLE(9,6)
がおすすめです。 - 緯度/経度の精度をそこまで重要視しない場合は、
FLOAT(7,4)
で十分です。 - 緯度/経度の値を正確に保存したい場合は、
DECIMAL(10,6)
などの形式でDECIMAL
型を使用します。
その他の考慮事項
- データベースのバージョン
- 使用するストレージエンジン
- 緯度/経度をどのように使用するのか
なども考慮する必要があります。
CREATE TABLE places (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
latitude DOUBLE(9,6) NOT NULL,
longitude DOUBLE(9,6) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO places (name, latitude, longitude)
VALUES ('東京', 35.6895, 139.6917),
('大阪', 34.6938, 135.5022),
('京都', 35.0213, 135.7555);
上記コードを実行すると、places
テーブルに3つのレコードが作成されます。
id
カラムは、レコードの一意の識別子です。name
カラムは、場所の名前です。
- 緯度/経度を保存する際には、空間インデックスを作成することをおすすめします。空間インデックスは、緯度/経度を使った検索を高速化することができます。
- 緯度/経度を地図上で表示したい場合は、Google Maps Platform などのサービスを利用することができます。
緯度/経度を保存するその他の方法
POINT型
GEOMETRY
型の中で、点の位置を表すデータ型です。
CREATE TABLE places (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
location POINT NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO places (name, location)
VALUES ('東京', POINT(35.6895, 139.6917)),
('大阪', POINT(34.6938, 135.5022)),
('京都', POINT(35.0213, 135.7555));
ST_GeomFromText()関数
文字列からGEOMETRY
型の値を作成する関数です。
INSERT INTO places (name, location)
VALUES ('東京', ST_GeomFromText('POINT(35.6895 139.6917)')),
('大阪', ST_GeomFromText('POINT(34.6938 135.5022)')),
('京都', ST_GeomFromText('POINT(35.0213 135.7555)'));
外部キー
別のテーブルに緯度/経度を保存し、外部キーを使用して関連付ける方法です。
CREATE TABLE locations (
id INT NOT NULL AUTO_INCREMENT,
latitude DOUBLE(9,6) NOT NULL,
longitude DOUBLE(9,6) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE places (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
location_id INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (location_id) REFERENCES locations (id)
);
INSERT INTO locations (latitude, longitude)
VALUES (35.6895, 139.6917),
(34.6938, 135.5022),
(35.0213, 135.7555);
INSERT INTO places (name, location_id)
VALUES ('東京', 1),
('大阪', 2),
('京都', 3);
- 緯度/経度を単なる数値として保存したい場合は、
DOUBLE
型やFLOAT
型がおすすめです。 - データ量が多い場合は、外部キーを使用して別のテーブルに保存することを検討します。
mysql database-design maps