sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué utilizar el tipo de datos geográficos de SQL Server 2008?

Si planea realizar algún cálculo espacial, EF 5.0 permite expresiones LINQ como:

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();
}

Entonces hay una muy buena razón para usar Geografía.

Explicación espacial dentro de Entity Framework .

Actualizado con Creación de bases de datos espaciales de alto rendimiento

Como señalé en Respuesta de Noel Abraham :

Comparando tipos de almacenamiento:

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'

Resultado:

name    rows    data     
Geo     20000   728 KB   
LatLon  20000   560 KB

El tipo de datos de geografía ocupa un 30 % más de espacio.

Además, el tipo de datos geográficos no se limita solo a almacenar un Punto, también puede almacenar LineString, CircularString, CompoundCurve, Polygon, CurvePolygon, GeometryCollection, MultiPoint, MultiLineString, MultiPolygon y más . Cualquier intento de almacenar incluso el más simple de los tipos de Geografía (como Lat/Long) más allá de un Punto (por ejemplo, instancia de LINESTRING(1 1, 2 2)) incurrirá en filas adicionales para cada punto, una columna para secuenciar el orden de cada punto y otra columna para agrupación de líneas. SQL Server también tiene métodos para los tipos de datos geográficos que incluyen calcular Área, Límite, Longitud, distancias y más .

Parece imprudente almacenar la latitud y la longitud como decimales en el servidor Sql.

Actualización 2

Si planea hacer cálculos como distancia, área, etc., es difícil calcularlos correctamente sobre la superficie de la tierra. Cada tipo de geografía almacenado en SQL Server también se almacena con un ID de referencia espacial . Estos id's pueden ser de diferentes esferas (la tierra es 4326). Esto significa que los cálculos en SQL Server realmente calcularán correctamente sobre la superficie de la tierra (en lugar de as- las-moscas-cuervo que podría ser a través de la superficie de la tierra).