sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor bruge SQL Server 2008 geografidatatypen?

Hvis du planlægger at foretage en rumlig beregning, tillader EF 5.0 LINQ-udtryk 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();
}

Så er der en rigtig god grund til at bruge Geografi.

Forklaring af rumlig inden for Entity Framework .

Opdateret med Oprettelse af højtydende rumlige databaser

Som jeg bemærkede på Noel Abrahams Answer :

Så sammenligning af lagertyper:

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 fylder 30 % mere.

Derudover er geografidatatypen ikke begrænset til kun at gemme et punkt, du kan også gemme LineString, CircularString, CompoundCurve, Polygon, CurvePolygon, GeometryCollection, MultiPoint, MultiLineString og MultiPolygon og mere . Ethvert forsøg på at gemme selv de simpleste geografityper (som Lat/Long) ud over et punkt (for eksempel LINESTRING(1 1, 2 2)-forekomst) vil medføre yderligere rækker for hvert punkt, en kolonne til sekventering for rækkefølgen af ​​hvert punkt og en anden kolonne til gruppering af linjer. SQL Server har også metoder til datatyperne Geografi, som omfatter beregning af Area, Boundary, Længde, afstande og mere .

Det virker uklogt at gemme breddegrad og længdegrad som decimal i SQL Server.

Opdatering 2

Hvis du planlægger at lave nogle beregninger som afstand, areal osv., er det svært at beregne disse korrekt over jordens overflade. Hver Geografi-type, der er gemt i SQL Server, er også gemt med et Spatial Reference ID . Disse id'er kan være af forskellige sfærer (jorden er 4326). Det betyder, at beregningerne i SQL Server faktisk vil beregne korrekt over jordens overflade (i stedet for as- fuglefuglene som kunne være gennem jordens overflade).



  1. En-til-mange relationer i (Postgre)SQL

  2. Undersøger en ORA 028513 DG4ODBC-fejl

  3. Sådan finder du den femte højeste løn i en enkelt forespørgsel i SQL Server

  4. OPDATERING eller INDSÆT MySQL Python