2009-12-18 4 views
1

J'ai quelques tableaux représentant des entités géographiques (CITIES, COUNTIES, ZIPCODES, STATES, COUNTRIES, etc.).Comment représenter un ensemble d'entités à partir de tables distinctes?

J'ai besoin de représenter des ensembles d'entités géographiques. Un ensemble peut contenir des enregistrements de plusieurs tables. Par exemple, un jeu peut contenir 3 enregistrements de CITIES, 1 enregistrement de COUNTIES et 4 de COUNTRIES.

Voici deux solutions possibles:

  • Une table qui contient trois colonnes - un enregistrement pour chaque entité. La table contiendra plusieurs enregistrements pour chaque ensemble, tous partageant le numéro de série.

set_id INT, foreign_table VARTEXT(255), foreign_id INT

Exemples d'entrées pour jeu # 5:

(5,'CITIES',4)

(5,'CITIES',12)

(5,'ZIPCODES',91)

(5,'ZIPCODES',92)

(5,'COUNTRIES',15)

  • une table qui contient une colonne de texte pour chaque type d'entité, qui comprendra une chaîne définir avec les entrées appropriées:

set_id INT,cities TEXT,counties TEXT,zipcodes TEXT,states TEXT,countries TEXT

Donc, l'ensemble ci-dessus sera représenté avec un seul enregistrement

(5,'4,12','','91,92','','15')

D'autres idées? J'adorerais entendre votre contribution. Merci!

Répondre

2

Les deux solutions que vous proposez n'ont pas de vraies clés étrangères. Dans la première solution, un foreign_id peut pointer vers plusieurs tables, ce qui est difficile (ou au moins inefficace) pour une base de données à appliquer. La deuxième solution stocke plusieurs valeurs dans une colonne, ce que tout le monde est d'accord que vous ne devriez pas faire (il casse first normal form.)

Ce que je voudrais faire est ceci: les villes, les codes postaux, et les états tous "ont un " localisation géographique. La façon normale d'implémenter cela est une relation de un à plusieurs. Créez une table de géolocalisation et ajoutez une colonne geolocation_id aux villes, au code postal et aux tables d'état.

EDIT: Par votre commentaire, pour obtenir d'une géolocalisation à ses villes:

select * 
from  geolocation g 
left join cities c 
on  g.id = c.geolocation_id 
left join zipcodes z 
on  g.id = z.geolocation_id 
.... 

La base de données résoudra les jointures en utilisant l'index de clé étrangère, ce qui est très rapide.

+0

Merci! Mais maintenant, étant donné un geolocation_id, comment puis-je remonter à la bonne table? Une façon consiste à ajouter une entrée foreign_id/foreign_table à la table de géolocalisation, mais nous revenons à la case départ. Ou suggérez-vous une requête avec plusieurs jointures? Est-ce efficace? Merci encore! – Sleepster

+0

@bosh: À droite, vous utiliseriez une requête avec plusieurs jointures. Tant que vous définissez des clés étrangères, c'est une opération très efficace! – Andomar

2
  • Un Location Set peut avoir de nombreux articles Geography
  • Un Geography élément peut appartenir à plusieurs Location Sets

En ce qui concerne la table d'éléments Geography, deux approches sont possibles. Dans le premier cas, la relation super-type/sous-type se chevauche: plus d'un sous-type peut être lié au super-type. Par exemple, il peut y avoir GeographyID = 5 dans les tableaux Geography et Zipcodes, Cities, States, Countries.

geography_model_01



Dans le second cas, on peut considérer la relation exclusive (disjointe), dans lequel un seul sous-type peut être relié au type super. La relation parent-enfant est utilisée pour créer des chemins, comme ZIP/City/State/Country - c'est-à-dire si les zones administratives réelles permettent ce type de relation.

Dans cet exemple, il peut y avoir GeographyID = 5 dans le Geography et seulement une autre table de sous-types.

geography_model_02

Questions connexes