2010-05-14 4 views
5

J'importe des données à une future base de données qui aura une table statique, MyISAM (sera seulement lu à partir de). J'ai choisi MyISAM parce que pour autant que je comprenne c'est plus rapide pour mes conditions (je ne suis pas très expérimenté avec MySQL/SQL du tout).Normaliser la base de données ou non? Lecture seule table MyISAM, la performance est la priorité principale (MySQL)

Cette table comportera plusieurs colonnes telles que ID, Nom, Sexe, Téléphone, Statut ... et les colonnes Pays, Ville et Rue. Maintenant, la question est, dois-je créer des tables (par exemple Country: Country_ID, Country_Name) pour les 3 dernières colonnes et se référer à eux dans la table principale par ID (normalize ... [?]), Ou simplement les stocker comme VARCHAR dans le table principale (ayant des doublons, évidemment)?

Ma principale préoccupation est la rapidité - puisque la table ne sera pas écrite, l'intégrité des données n'est pas une priorité. Les seules actions seront la sélection d'une ligne spécifique ou la recherche de lignes répondant à certains critères.

Est-ce que la recherche par les colonnes Pays, Ville et/ou Rue (et éventuellement d'autres colonnes dans la même recherche) serait plus rapide si j'utilisais simplement VARCHAR?

EDIT: La table contient environ 30 colonnes et environ 10m lignes.

+0

Avez-vous envisagé d'autres mécanismes de stockage? MySQL peut vous coûter plus cher que vous n'avez pas besoin de payer à cause des capacités que vous n'utilisez pas. Vous pouvez trouver quelques solutions de rechange ici: http://en.wikipedia.org/wiki/Nosql http://en.wikipedia.org/wiki/Embedded_database –

Répondre

4

Il peut être plus rapide de rechercher si vous normalisez car la base de données n'aura qu'à comparer un entier au lieu d'une chaîne. Les données de la table seront également plus petites, ce qui rend la recherche plus rapide car plus de mémoire peut être chargée en même temps.

Si vos tables sont indexées correctement, elles seront très rapides dans les deux cas - vous ne remarquerez probablement pas de différence significative.

Vous pouvez également regarder un full text search si vous vous trouvez en train d'écrire LIKE '%foo%' car ce dernier ne pourra pas utiliser un index et résultera en un balayage de table complet.

+0

+1 @hello Assurez-vous de vos tables INDEX CORRECTEMENT !!!! –

+0

Je ne suis pas forcément d'accord pour dire que * il sera plus rapide de chercher si les tables sont normalisées, mais dans l'ensemble c'est un bon conseil. –

+0

D'accord, l'indexation est une haute priorité pour les performances. Cependant, la normalisation n'a rien à voir avec la comparaison des entiers et des chaînes. L'introduction des clés de substitution ne se normalise pas. – reaanb

1

Je vais essayer de vous donner quelque chose de plus que la réponse habituelle "Ça dépend".

# 1 - Tout est rapide pour un petit N - si vous avez moins de 100 000 lignes, chargez-le à plat, indexez-le selon vos besoins et passez à une priorité plus élevée. Garder tout à plat dans une table est plus rapide pour tout lire (toutes les colonnes), mais pour chercher ou chercher, vous avez généralement besoin d'index, si vos données sont très volumineuses avec des informations redondantes sur la ville et le pays, il vaut mieux avoir des clés étrangères de substitution dans des tables séparées, mais vous ne pouvez pas vraiment dire dur et rapide. C'est pourquoi certains principes de modélisation des données sont presque toujours utilisés: soit normalisé (par exemple Entité-Relation), soit dimensionnel (par exemple Kimball) est généralement utilisé - les règles ou méthodologies dans les deux cas sont conçues pour vous aider à modéliser les données sans avoir à anticiper chaque cas d'utilisation. De toute évidence, connaître tous les modèles d'utilisation biaisera votre modèle de données pour les soutenir - de sorte qu'un grand nombre d'agrégations et d'analyses est un indicateur fort pour utiliser un modèle dimensionnel dénormalisé. Par conséquent, cela dépend beaucoup de votre profil de données (largeur de ligne et nombre de lignes) et de vos habitudes d'utilisation.

+0

J'ai oublié de mentionner la "taille" de la table. Environ 30 colonnes de largeur (les types de colonne varient, principalement VARCHAR) et environ 10m lignes. Donc, je suppose que la normalisation serait plus sage. – hello

+0

@hello La normalisation est généralement bonne, mais une approche dimensionnelle peut avoir de réels avantages - en particulier, je pense à la technique de la «junk dimension» qui peut rendre très rapide la recherche de combinaisons de codes/types/démographies. –

0

Je n'ai malheureusement pas beaucoup plus que la réponse habituelle "Ça dépend".

Allez avec autant de normalisation que nécessaire pour les recherches que vous effectuez réellement. Si vous ne cherchez jamais des gens qui vivent sur Elm Street à Sacramento ou sur l'avenue Maple à Denver, tout effort pour normaliser ces colonnes est assez gaspillé.Habituellement, vous normaliseriez quelque chose comme ça pour éviter les erreurs de mise à jour, mais vous avez déclaré que l'intégrité des données n'est pas un risque.

Regardez votre journal de requête lente comme un faucon! Cela vous dira ce que vous devez normaliser. Faites EXPLAIN sur ces requêtes et déterminez si vous pouvez ajouter un index pour l'améliorer ou si vous avez besoin de normaliser.

J'ai travaillé avec certains modèles de données que nous appellerions «hyper-normalisés». Ils étaient dans toutes les formes normales appropriées, mais souvent pour des choses qui n'en avaient pas besoin pour la façon dont nous utilisions les données. Ces types de modèles de données sont difficiles à comprendre d'un coup d'œil, et ils peuvent être très agaçants.

Questions connexes