ما نوع البيانات للاستخدام عند تخزين بيانات خطوط الطول والعرض في قواعد بيانات SQL؟ [مكرر
-
20-09-2019 - |
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
عند تخزين بيانات خطوط الطول أو خط الطول في قاعدة بيانات متوافقة مع ANSI SQL، ما هو نوع Datatype الأكثر ملاءمة؟ ينبغي float
أن تستخدم، أو decimal
, ، أو ...؟
أنا أدرك أن Oracle و MySQL و SQL Server أضف بعض أنواع البيانات الخاصة خصيصا للتعامل مع بيانات GEO، لكنني مهتم بكيفية تخزين المعلومات في قاعدة بيانات SQL "Pill Vanilla".
المحلول
Decimal(9,6)
إذا لم تكن معتادا على الدقة والمعلمات النطاق، فإليك سلسلة تنسيق مرئية:
###.######
نصائح أخرى
نستخدم تعويم، لكن أي نكهة رقيقة مع 6 منازل عشرية يجب أن تعمل أيضا.
في الفانيليا أوراكل، تتطلب الميزة المسماة تحديد المواقع (إصدار شلل من المكاني) تخزين بيانات الإحداثيات باستخدام نوع البيانات للرقم (بدون دقة). عند محاولة إنشاء فهارس قائمة على الوظائف لدعم الاستفسارات المكانية فسوف تقوم بخلاف ذلك.
يمكنك بسهولة تخزين رقم عشري عشري Lat / Lon في حقل عدد صحيح غير موقعة، بدلا من تقسيمها في جزء صحيح وعشري وتخزين الأشخاص بشكل منفصلين كما اقترحوا إلى حد ما هنا باستخدام خوارزمية التحويل التالية:
كدالة mysql المخزنة:
CREATE DEFINER=`r`@`l` FUNCTION `PositionSmallToFloat`(s INT)
RETURNS decimal(10,7)
DETERMINISTIC
RETURN if( ((s > 0) && (s >> 31)) , (-(0x7FFFFFFF -
(s & 0x7FFFFFFF))) / 600000, s / 600000)
والعودة
CREATE DEFINER=`r`@`l` FUNCTION `PositionFloatToSmall`(s DECIMAL(10,7))
RETURNS int(10)
DETERMINISTIC
RETURN s * 600000
التي يجب تخزينها في غير موقعة الدولية (10), ، يعمل هذا في MySQL وكذلك في SQLite وهو ملء.
من خلال التجربة، أجد أن هذا يعمل بسرعة كبيرة، إذا كان كل ما تحتاج إليه هو تخزين إحداثيات واسترجاع أولئك للقيام ببعض الرياضيات.
في PHP تلك الوظائف 2 تبدو وكأنها
function LatitudeSmallToFloat($LatitudeSmall){
if(($LatitudeSmall>0)&&($LatitudeSmall>>31))
$LatitudeSmall=-(0x7FFFFFFF-($LatitudeSmall&0x7FFFFFFF))-1;
return (float)$LatitudeSmall/(float)600000;
}
والعودة مرة أخرى:
function LatitudeFloatToSmall($LatitudeFloat){
$Latitude=round((float)$LatitudeFloat*(float)600000);
if($Latitude<0) $Latitude+=0xFFFFFFFF;
return $Latitude;
}
هذا لديه بعض ميزة إضافية بالإضافة إلى إنشاء على سبيل المثال مفاتيح فريدة من نوعها مع الأعداد الصحيحة. (على سبيل المثال: لذاكرة التخزين المؤقت نتيجة Geocode). نأمل أن يضيف هذا قيمة إلى المناقشة.
يمكن أن يكون تطبيق آخر عندما تكون بدون ملحقات GIS، وتريد ببساطة الاحتفاظ بضعة ملايين من أزواج Lat / Lat، يمكنك استخدام الأقسام الموجودة على تلك الحقول في MySQL للاستفادة من حقيقة أنها أعداد صحيحة:
Create Table: CREATE TABLE `Locations` (
`lat` int(10) unsigned NOT NULL,
`lon` int(10) unsigned NOT NULL,
`location` text,
PRIMARY KEY (`lat`,`lon`) USING BTREE,
KEY `index_location` (`locationText`(30))
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY KEY ()
PARTITIONS 100 */
أود استخدام عشري بدقة مناسبة لبياناتك.
أعتقد أنه يعتمد ذلك على العمليات التي ستحتاج إليها في كثير من الأحيان.
إذا كنت بحاجة إلى القيمة الكاملة كرقم عشري، فاستخدم عشري بدقة وحجم مناسب. تعويم هو الطريق وراء احتياجاتك، وأعتقد.
إذا كنت ستتعطل من / من Degºmin'Sec "تدويج الكسر في كثير من الأحيان، فستفكر في تخزين كل قيمة كوعي عدد صحيح (Smallint أو Tinyint أو Tinyint أو Smallint؟).
يجب أن نلقي نظرة على أنواع البيانات المكانية الجديدة التي تم تقديمها في SQL Server 2008. وهي مصممة خصيصا هذا النوع من المهمة وإجراء الفهرسة والاستعلام عن البيانات أسهل وأكثر كفاءة.
http://msdn.microsoft.com/en-us/library/bb933876(V=SQL.105).aspx.
http://blogs.technet.com/andrew/archive/2007/11/26/sql-server-2008-spatial-data-types.aspx.