2010-03-31 24 views
8

Je suis en train de concevoir une application qui doit sauvegarder des formes géométriques dans une base de données. Je n'ai pas encore choisi le système de gestion de base de données.Ai-je besoin d'un index spatial dans ma base de données?

Dans mon application, toutes les requêtes de base de données auront une boîte englobante en entrée, et en sortie, je veux toutes les formes dans cette base de données. Je sais que les bases de données avec un index spatial sont utilisées pour ce genre d'application. Mais dans mon application il y aura pas être des requêtes de type "me donner des objets à proximité x/y" ou d'autres requêtes plus complexes qui sont utiles dans une application SIG.

Je prévois d'avoir une base de données sans un index spatial et ont des requêtes ressemblant à:

SELECT * FROM shapes WHERE x < max_x AND x > min_x AND y < max_y AND y > min_y 

et ont un indice sur les colonnes x (double) et y (double). Tant que je peux voir, je n'ai pas vraiment besoin d'une base de données avec un index spatial, quel que soit mon application est proche de ce genre d'applications.

Et même si je voudrais avoir des requêtes à proximité, alors je pourrais créer une boîte de délimitation assez grande autour de ce point. Ou cela conduira-t-il à une mauvaise performance?

Ai-je vraiment besoin d'une base de données spatiale? Et quand un index spatial est-il nécessaire?

EDIT: Les requêtes de recherche seront effectivement un peu plus avancé que celui que j'ai écrit ci-dessus, puisque je traite avec des formes géométriques je vais entrer une boîte englobante qui renverra plusieurs formes (avec boîte englobante) qui sont à l'intérieur ou interférer avec la boîte dans la requête. Mais je pense toujours que je peux le faire sans indice spatial, après avoir lu toutes les bonnes réponses.

+0

Quel est le "coût" de l'utilisation de postgis ou spatiallite? Je ne comprends pas pourquoi tu ne voudrais pas les utiliser. – TheSteve0

+0

@ TheSteve0: Je n'ai pas encore décidé quels dbms j'utiliserais. Mais je ne voudrais pas être limité à un avec un index spatial. Peut-être que je vais pour une base de données NoSQL distribuée istead d'un SGBDR. – Jonas

+0

Eh bien, quel est votre cas d'utilisation - si cela ne vous dérange pas de partager – TheSteve0

Répondre

2

Ai-je vraiment besoin d'une base de données spatiale?

Il semble que ce que vous faites fonctionnera bien pour votre application.

Et même si je voudrais avoir requêtes à proximité, alors je pourrais créer un cadre de sélection assez grand autour de ce point .

Vous pouvez envisager de créer un index sur un Geohash à la place. Cette méthode est recommandée pour l'indexation de points géo-spatiaux sur Google App Engine, par exemple, lorsque les fonctionnalités d'indexation sont limitées. (Source)

Et quand un index spatial est-il nécessaire?

Il existe de nombreux scénarios dans lesquels un index spatial est utile. Tout d'abord, les index spatiaux peuvent traiter non seulement des points, mais aussi des polylignes, des polygones et d'autres formes. En outre, comme vous l'avez déjà mentionné, de nombreuses opérations de requêtes complexes peuvent être appliquées aux données spatiales, où un index spatial approprié serait essentiel.

+0

Merci! Le Geohash a l'air très bien, merci pour le lien. Oui, ma base de données traitera non seulement des points, mais aussi des polygones et des lignes. Mais les requêtes de recherche seront uniquement sur des boîtes de délimitation. – Jonas

2

Non, vous n'avez pas besoin d'index spatial pour cela.

Les indices spatiaux sont nécessaires pour calculer la distance entre les objets, voir si un point est dans un certain rayon d'un autre point, etc ... surtout lorsque vous devez prendre en compte les coordonnées géographiques. L'hémisphère sud, l'hémisphère nord, etc ... tout change un peu de la distance lorsque vous devez prendre en compte la courbe de la terre.

Si vous recherchez toujours x et y, vous bénéficieriez d'un index sur les deux éléments en même temps. Donc ... pas un index sur la colonne x et un index sur la colonne y, mais un index sur la colonne x et y combinés.

+0

Merci pour l'explication et la suggestion d'un index combiné. – Jonas

1

Si vous n'allez pas au-delà de ce que vous faites déjà, vous n'avez pas besoin d'un index spatial ni d'un SIG pour cela. Cependant, je considérerais soigneusement quelles sont vos exigences et les chances de l'application de plus en plus besoin d'un système SIG. Il vaut mieux que planifier plus tôt que plus tard pour cette transition.

GIS vous offre plusieurs avantages. Tout d'abord, un SIG a une colonne de forme spéciale pour stocker tout ce qui est nécessaire à propos d'une géométrie. Il gère la référence spatiale, les métadonnées de coordonnées, etc. Un SIG fournit des méthodes puissantes pour interroger les données en fonction des relations spatiales et en modifiant les géométries (unions, extractions, tampons, etc.). Il gère les points, les lignes, les polygones, etc. Vous pouvez dériver de nouvelles formes à partir d'opérations topologiques. De plus, presque tous les systèmes SIG fournissent des moyens pour rendre les données (cela dépend vraiment du SIG que vous choisissez mais quand il est présent, il vous permet d'économiser des tonnes de travail).

Vous aurez seulement besoin d'index spatiaux si vous avez un véritable environnement SIG.Si vous choisissez un environnement SIG, oui, utilisez des index spatiaux - vous ne voulez vraiment pas travailler sans eux.

+0

Merci! Je vais concevoir ma demande avec soin. Je vais essayer de garder les procédures avancées dans le logiciel frontal et de garder le stockage back-end simple, donc je peux mettre à l'échelle facile. – Jonas

2

Pour ajouter aux réponses excellentes existantes, la performance peut ou peut ne pas être importante ici. Si vous simulez une requête de plage d'index spatial en effectuant deux requêtes de plage pour les axes x et y et en prenant l'intersection des résultats, vous effectuez deux requêtes qui peuvent renvoyer beaucoup plus de données que nécessaire avant l'intersection. D'autre part, une telle requête est supportée nativement par un index spatial et, à ce titre, une réponse efficace sera fournie. Dans l'ensemble, si vos requêtes spatiales sont le goulot d'étranglement, vous aurez besoin d'utiliser un index spatial.