Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum den geografischen Datentyp von SQL Server 2008 verwenden?

Wenn Sie planen, räumliche Berechnungen durchzuführen, erlaubt EF 5.0 LINQ-Ausdrücke wie:

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

Dann gibt es einen sehr guten Grund, Geographie zu verwenden.

Erklärung von Spatial in Entity Framework .

Aktualisiert mit Erstellen von räumlichen Hochleistungsdatenbanken

Wie ich auf Antwort von Noel Abraham angemerkt habe :

Vergleichen Sie also Speichertypen:

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'

Ergebnis:

name    rows    data     
Geo     20000   728 KB   
LatLon  20000   560 KB

Der Datentyp "Geographie" nimmt 30 % mehr Platz ein.

Außerdem ist der geografische Datentyp nicht darauf beschränkt, nur einen Punkt zu speichern, Sie können auch speichern LineString, CircularString, CompoundCurve, Polygon, CurvePolygon, GeometryCollection, MultiPoint, MultiLineString und MultiPolygon und mehr . Jeder Versuch, selbst die einfachsten Geografietypen (als Lat/Long) über einen Punkt hinaus zu speichern (z. B. LINESTRING(1 1, 2 2)-Instanz), führt zu zusätzlichen Zeilen für jeden Punkt, einer Spalte zur Sequenzierung für die Reihenfolge jedes Punkts und eine weitere Spalte zum Gruppieren von Zeilen. SQL Server verfügt auch über Methoden für die Datentypen Geographie, die die Berechnung von Fläche, Grenze, Länge, Entfernungen und mehr .

Es erscheint unklug, Längen- und Breitengrad in Sql Server als Dezimalzahl zu speichern.

Aktualisierung 2

Wenn Sie vorhaben, Berechnungen wie Entfernung, Fläche usw. durchzuführen, ist es schwierig, diese über die Erdoberfläche richtig zu berechnen. Jeder in SQL Server gespeicherte Geografietyp wird auch mit einer Raumbezugs-ID gespeichert . Diese IDs können aus verschiedenen Sphären stammen (die Erde ist 4326). Das bedeutet, dass die Berechnungen in SQL Server tatsächlich korrekt über der Erdoberfläche (statt as- die-krähen was durch die Erdoberfläche sein könnte).