Ich habe eine vorhandene Datenbanklösung, die nicht sehr gut funktioniert. Ich suche nach mehrdimensionalen Daten mit einer traditionellen Tabellenstruktur unter Verwendung von Floats usw. Die Datenbank enthält ~ 1-2 Millionen Zeilen.
Nach einiger Suche bin ich auf die SQL Server-Geodatentypen gestoßen, bei denen Sie eine Geometrie basierend auf Point oder MultiPoint definieren können, bei der Sie mit einer Entfernung suchen können. Ich denke, dies könnte eine Lösung sein, aber ich brauche Hilfe, um in die richtige Richtung zu starten.
Meine aktuelle Tabellenstruktur lautet wie folgt: Jede Zeile enthält 2 (eventuell mehr) XYZ-Werte:
| ID | X1 | Y1 | Z1 | X2 | Y2 | Z2 |
| 1 | 1.1 | 2.2 | 5.1 | 1.2 | 2.1 | 4.1 |
| 2 | 3.2 | 5.1 | 4.1 | 3.2 | 3.1 | 3.1 |
| 3 | 4.1 | 2.3 | 6.3 | 4.2 | 4.1 | 2.1 |
| 4 | 2.4 | 3.5 | 2.1 | 3.2 | 2.1 | 4.1 |
Ich führe eine Suche mit einer Toleranz für jeden X-, Y- und Z-Wert durch.
Also zum Beispiel:
(pseudocode)
declare targetXYZ1 = (4.1, 2.2, 3.1);
declare targetXYZ2 = (2.8, 2.2, 4.2);
declare toleranceXYZ = (2,2,2)
Select ID from MyXYZTable tb
Where
Math.Abs(tb.X1 - targetXYZ1.X1) < toleranceXYZ.X
AND Math.Abs(tb.Y1 - targetXYZ1.Y1) < toleranceXYZ.Y
AND Math.Abs(tb.Z1 - targetXYZ1.Z1) < toleranceXYZ.Z
AND Math.Abs(tb.X2 - targetXYZ1.X2) < toleranceXYZ.X
AND Math.Abs(tb.Y2 - targetXYZ1.Y2) < toleranceXYZ.Y
AND Math.Abs(tb.Z2 - targetXYZ1.Z2) < toleranceXYZ.Z
Nach einiger Analyse müsste ich wahrscheinlich eine Tabelle mit 1 oder 2 Geometriespalten für xyz1 und xyz2 mit Geometrie :: Punkt (0, 0, 0) erstellen.
Meine Fragen:
- Ist mit räumlichen SQL Server-Typen eine Lösung möglich?
- Muss ich die Suche nach dem nächsten Nachbarn verwenden oder kann ich STDistance verwenden?
- Muss ich einen räumlichen Index für die Tabelle einrichten?
Ratschläge oder Tipps und Tricks sind herzlich willkommen!