2012-03-15 2 views
0

Point data type에 대한 Microsoft SQL Server 2008 R2 설명서를 볼 때 위도와 경도가 부동으로 제공 될 것으로 예상됩니다.지리 정보 데이터 유형은 경도와 위도가 부동로 필요하지만 제안 된 데이터 유형은 10 진수입니다. 누가 옳은가?

그러나, this post on SO suggests that the better data type for storing long and lat is decimal(9,6).

그래서 Microsoft는 왜 수레를 사용합니까?

업데이트 : 다음 예제에서는 위치를 위도/경도 나는 점에 부동 소수점 데이터 유형과 일치, 또는 소수를 유지해야, 성능을 향상시키기 위해 비정규입니까?

CREATE TABLE [dbo].[GeoTest](
    [Id] [INT] IDENTITY(1,1) NOT NULL, 
    [Lat] [decimal](9, 6) NOT NULL, 
    [Long] [decimal](9, 6) NOT NULL, 
    [GeoPoint] [GEOGRAPHY] NOT NULL, 
CONSTRAINT [PK_GeoTest] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

스키마는 위의이 날 수 있습니다 : 이것보다 오히려

SELECT Lat, Long FROM GeoTest WHERE GeoPoint.STDistance(GEOGRAPHY::Point(47.6475, -122.1393, 4326))/1609.344 <= 20 

: 느린

SELECT GeoPoint.Lat, GeoPoint.Long FROM GeoTest WHERE GeoPoint.STDistance(GEOGRAPHY::Point(47.6475, -122.1393, 4326))/1609.344 <= 20 

. 두 데이터 유형이 다르다는 것이 놀랍습니다.

+0

중요한 소수 자릿수를 정확하게 결정할 수 있습니까? 예를 들어 둘 중 하나가 잘못된 결정이 될 수 있습니까? –

+0

지형 데이터 유형을 사용하고 있지 않다면 Point 데이터 유형을 질문과 혼동스럽게 생각합니다. 지형 데이터 유형을 사용하지 않는 경우 "일반"데이터 유형을 위도/경도에 사용해야합니다. 이것들은 완전히 다른 두 가지입니다. 그래서 그것들을 비교하는 것은 의미가 없습니다. – Pondlife

+0

@ Pondlife 나는 이것이 내 다른 질문과 함께 좀 더 의미가 있다고 생각한다 : http://stackoverflow.com/questions/9723533/is-it-wise-to-denormalize-latitude-and-longitude-to-make- a-geospatial-query-fast – Junto

답변

0

내부적으로, SQL 서버 기억 형상과 각 좌표치 http://download.microsoft.com/download/7/9/3/79326E29-1E2E-45EE-AA73-74043587B17D/%5BMS-SSCLRT%5D.pdf

의 문서에 설명 된 포맷을 사용하여 지리 데이터는 64 비트 길이 (8 바이트) 배정 밀도 부동 소수점 값으로 직렬화된다. 따라서 Point() 메서드에 대한 입력 매개 변수가 이와 일치하도록하는 것이 합리적입니다. 즉, float 데이터 유형을 사용하십시오.

@Pondlife가 가리키는 것처럼, 참조하는 다른 게시물은 완전히 다른 질문 인 좌표 값을 저장하기위한 일반 데이터 유형과 관련됩니다.

관련 문제