2010-12-08 6 views
0

J'ai des ensembles de données assez volumineux et j'utilise le module de données hiérarchiques pytables. En décrivant les bases de données, je me demande s'il serait plus rapide de créer des tables avec beaucoup de lignes et une seule colonne de valeur, ou dans un format 'matrice' plus courant.Quel est le sentiment général sur les formes de base de données efficaces?

Par exemple:

from_cty, to_cty, valeur
austin, New York, 9000
dallas, New York, 8000
New York, dallas, 8400
austin, dallas, 5030
dallas, austin, 4022
New york, austin, 8002
etc ...

--ou--

Villes '' '' '' '', austin, dallas, New York
austin '' '' '' », 0000, 5030, 9000
dallas '' '' '' », 4022, 0000, 8000
New york, 8002, 8400, 0000

Avantages du premier type pourraient notamment être en mesure de tirer une seule colonne comme une fois, sélectionnée par provenance ou à destination des villes. Mais il ajoute une colonne qui serait normalement les noms de colonnes.

Répondre

1

Commencez toujours par un modèle normalisé en pensant à votre utilisation principale de la table. D'après les données d'exemple que vous avez montrées, il semble probable que des villes supplémentaires seront ajoutées. Si vous allez avec votre deuxième exemple, cela nécessiterait des modifications de schéma, ce qui est généralement une mauvaise chose.

Si le besoin se fait sentir d'interroger les données dans le second format, vous pouvez toujours fournir une vue ou même une table permanente que vous actualisez périodiquement. Ou si votre schéma d'utilisation principal vous oblige à accéder aux données dans ce format, vous devez bien sûr le modéliser en conséquence. Essayez-le, mesurez-le et effectuez les réglages appropriés.

0

alt text

prévoyant que, dans ce modèle "Austin-Dallas" est le même que "Dallas-Austin" vous pouvez empêcher inverse-doublons dans la table Distance en utilisant

ALTER TABLE Distance ADD CONSTRAINT chk_id CHECK (FromCityId < ToCityId); 

Puis lors de l'interrogation vous pouvez utiliser quelque chose comme:

select 
     a.CityName as FromCity 
    , b.CityName as ToCity 
    , Value  as Travel 
from Distance as d 
join City  as a on a.CityId = d.FromCityId 
join City  as b on b.CityId = d.ToCityId 
where (a.CityName = 'Austin' and b.CityName = 'Dallas') 
    or (a.CityName = 'Dallas' and b.CityName = 'Austin') ; 

EDIT: Juste remarqué que dans votre exemple "Austin-Dallas" n'est pas le même que "Dallas-Austin", donc pas besoin de la contrainte de vérification et la deuxième ligne de la clause WHERE.

Questions connexes