Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi utiliser le type de données géographique SQL Server 2008 ?

Si vous envisagez d'effectuer des calculs spatiaux, EF 5.0 autorise les expressions LINQ telles que :

private Facility GetNearestFacilityToJobsite(DbGeography jobsite)
{   
    var q1 = from f in context.Facilities            
             let distance = f.Geocode.Distance(jobsite)
             where distance < 500 * 1609.344     
             orderby distance 
             select f;   
    return q1.FirstOrDefault();
}

Alors il y a une très bonne raison d'utiliser la géographie.

Explication de l'espace dans Entity Framework .

Mise à jour avec Création de bases de données spatiales hautes performances

Comme je l'ai noté sur Réponse de Noel Abrahams :

Comparons donc les types de stockage :

CREATE TABLE dbo.Geo
(    
geo geography
)
GO

CREATE TABLE dbo.LatLng
(    
    lat decimal(15, 12),   
    lng decimal(15, 12)
)
GO

INSERT dbo.Geo
SELECT geography::Point(12.3456789012345, 12.3456789012345, 4326) 
UNION ALL
SELECT geography::Point(87.6543210987654, 87.6543210987654, 4326) 

GO 10000

INSERT dbo.LatLng
SELECT  12.3456789012345, 12.3456789012345 
UNION
SELECT 87.6543210987654, 87.6543210987654

GO 10000

EXEC sp_spaceused 'dbo.Geo'

EXEC sp_spaceused 'dbo.LatLng'

Résultat :

name    rows    data     
Geo     20000   728 KB   
LatLon  20000   560 KB

Le type de données géographique occupe 30 % d'espace en plus.

De plus, le type de données géographique n'est pas limité au stockage d'un point, vous pouvez également stocker LineString, CircularString, CompoundCurve, Polygon, CurvePolygon, GeometryCollection, MultiPoint, MultiLineString et MultiPolygon et plus . Toute tentative de stocker même le plus simple des types de géographie (comme Lat/Long) au-delà d'un point (par exemple LINESTRING(1 1, 2 2) instance) entraînera des lignes supplémentaires pour chaque point, une colonne pour le séquençage de l'ordre de chaque point et une autre colonne pour le regroupement des lignes. SQL Server dispose également de méthodes pour les types de données Géographie qui incluent le calcul de Area, Boundary, Longueur, distances et plus .

Il semble imprudent de stocker Latitude et Longitude en décimal dans Sql Server.

Mise à jour 2

Si vous envisagez de faire des calculs comme la distance, la superficie, etc., il est difficile de les calculer correctement sur la surface de la terre. Chaque type de géographie stocké dans SQL Server est également stocké avec un ID de référence spatiale . Ces identifiants peuvent être de différentes sphères (la terre est 4326). Cela signifie que les calculs dans SQL Server seront en fait calculés correctement sur la surface de la terre (au lieu de as- les-mouches-des-corbeau qui pourrait être à travers la surface de la terre).