sql >> Databasteknik >  >> RDS >> Sqlserver

Varför använda geografidatatypen SQL Server 2008?

Om du planerar att göra någon rumslig beräkning tillåter EF 5.0 LINQ-uttryck som:

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

Då finns det en mycket god anledning att använda Geografi.

Förklaring av spatial inom Entity Framework .

Uppdaterad med Skapa högpresterande rumsliga databaser

Som jag noterade på Noel Abrahams svar :

Så att jämföra lagringstyper:

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'

Resultat:

name    rows    data     
Geo     20000   728 KB   
LatLon  20000   560 KB

Geografidatatypen tar upp 30 % mer utrymme.

Dessutom är geografidatatypen inte begränsad till att bara lagra en punkt, du kan också lagra LineString, CircularString, CompoundCurve, Polygon, CurvePolygon, GeometryCollection, MultiPoint, MultiLineString och MultiPolygon med flera . Varje försök att lagra även de enklaste geografityperna (som Lat/Long) bortom en punkt (till exempel LINESTRING(1 1, 2 2)-instans) kommer att medföra ytterligare rader för varje punkt, en kolumn för sekvensering för varje punkts ordning och en annan kolumn för gruppering av linjer. SQL Server har också metoder för datatyperna Geografi som inkluderar beräkning av Area, Boundary, Längd, avstånd och mer .

Det verkar oklokt att lagra latitud och longitud som decimal i SQL Server.

Uppdatering 2

Om du planerar att göra några beräkningar som avstånd, area, etc, är det svårt att korrekt beräkna dessa över jordens yta. Varje geografityp som lagras i SQL Server lagras också med ett Spatialt referens-ID . Dessa id:n kan vara av olika sfärer (jorden är 4326). Detta innebär att beräkningarna i SQL Server faktiskt kommer att beräknas korrekt över jordens yta (istället för as- fågelflugorna som kan vara genom jordens yta).



  1. Genererar en MySQL timuppdelning från aktuell tidsstämpel

  2. Ärendeutlåtande med olika datatyp

  3. Hur begår jag och återställer transaktionen i SQL-servern?

  4. mysql count prestanda