Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que usar o tipo de dados de geografia do SQL Server 2008?


Se você planeja fazer qualquer computação espacial, o EF 5.0 permite expressões 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();
}

Então há uma razão muito boa para usar Geografia.

Explicação de espacial dentro do Entity Framework .

Atualizado com Criando bancos de dados espaciais de alto desempenho

Como observei em Resposta de Noel Abrahams :

Então, comparando os tipos de armazenamento:
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

O tipo de dados de geografia ocupa 30% mais espaço.

Além disso, o tipo de dados de geografia não se limita apenas a armazenar um Ponto, você também pode armazenar LineString, CircularString, CompoundCurve, Polygon, CurvePolygon, GeometryCollection, MultiPoint, MultiLineString e MultiPolygon e muito mais . Qualquer tentativa de armazenar até mesmo o mais simples dos tipos Geography (como Lat/Long) além de um Point (por exemplo, LINESTRING(1 1, 2 2) instance) incorrerá em linhas adicionais para cada ponto, uma coluna para sequenciamento para a ordem de cada ponto e outra coluna para agrupamento de linhas. O SQL Server também tem métodos para os tipos de dados Geography que incluem o cálculo de Área, Limite, Comprimento, distâncias e muito mais .

Parece imprudente armazenar Latitude e Longitude como Decimal no Sql Server.

Atualização 2

Se você planeja fazer quaisquer cálculos como distância, área, etc., calculá-los corretamente sobre a superfície da Terra é difícil. Cada tipo de geografia armazenado no SQL Server também é armazenado com um ID de referência espacial . Esses id's podem ser de diferentes esferas (a terra é 4326). Isso significa que os cálculos no SQL Server irão realmente calcular corretamente sobre a superfície da Terra (em vez de as- as-moscas-corvo que poderia ser através da superfície da terra).