Partitionnement de la base de données - Horizontal vs Vertical-différence entre la normalisation et le dédoublement des rangs?
j'essaie de saisir les différents concepts de partitionnement de la base de données et c'est ce que j'en ai compris:
partitionnement Horizontal/partage : fractionnement d'une table en une autre table qui contiendra un sous-ensemble des lignes qui étaient dans la table initiale (un exemple que j'ai vu beaucoup si la division d'une table D'utilisateurs par Continent, comme un sous-tableau pour L'Amérique du Nord, un autre pour l'Europe, etc...). Chacun partition étant dans un autre emplacement physique (comprendre "machine"). D'après ce que j'ai compris, le partitionnement Horizontal et le partage sont exactement la même chose(?).
partitionnement Vertical : D'après ce que j'ai compris ( http://technet.microsoft.com/en-us/library/ms178148%28v=sql.105%29.aspx ), il y a 2 sortes de partitionnement Vertical:
-
normalisation (qui consiste à supprimer les redondances d'une base de données en séparant les tables et en les reliant avec une clé étrangère).
-
Row Splitting , voici ce que je ne comprends pas, quelle est la différence entre normalisation et Row Splitting ? En quoi ces deux techniques diffèrent-elles l'une de l'autre?
j'ai également lu dans ce post ( différence entre l'échelle horizontale et verticale pour les bases de données ) que la différence entre le partitionnement Horizontal et le partitionnement Vertical est que dans le premier vous échelle en ajoutant plus de machines, tandis que dans le second vous échelle en ajoutant plus de puissance (CPU, RAM) à votre machine existante, est-ce une définition correcte? Je pensais que le noyau différence entre ces 2 techniques réside dans la façon dont vous divisez vos tables.
je suis désolé pour la charge de questions, mais je suis un peu confus car beaucoup de différents sites Web que j'ai rencontré disent des choses différentes.
toute aide clarifiant serait grandement appréciée. Tout lien vers un clair et simple démonstration avec quelques tables serait également très utile.
4 réponses
partitionnement est un concept assez général et peut être appliqué dans de nombreux contextes. Quand il considère le partitionnement de la relationnelle données , il se réfère habituellement à la décomposition de vos tables soit ligne-Sage (horizontalement) ou colonne-Sage (verticalement).
partitionnement Vertical, alias dédoublement de ligne, utilise les mêmes techniques de fractionnement que la normalisation de la base de données, mais généralement le terme (vertical / horizontal) partitionnement de données se réfère à un optimisation physique , alors que la normalisation est une optimisation sur le conceptuel .
puisque vous demandez une simple démonstration-supposons que vous avez une table comme celle-ci:
create table data (
id integer primary key,
status char(1) not null,
data1 varchar2(10) not null,
data2 varchar2(10) not null);
One way to partition data
verticalement : divisé comme suit:
create table data_main (
id integer primary key,
status char(1) not null,
data1 varchar2(10) not null );
create table data_rarely_used (
id integer primary key,
data2 varchar2(10) not null,
foreign key (id) references data_main (id) );
Ce type de partitionnement peut être appliqué, par exemple, lorsque vous rarement besoin de la colonne 2 dans vos requêtes. La Partition data_main prendra moins de place, donc les scans complets de la table seront plus rapides et il est plus probable qu'elle rentre dans le cache de la page du SGBD. L'inconvénient: quand vous devez interroger toutes les colonnes de data
, vous devez obivously rejoindre les tables, ce qui sera plus cher que la interrogation de la table originale.
notez que vous divisez les colonnes de la même manière que vous le feriez lorsque vous normalisez les tables. Toutefois, dans ce cas data
pourrait déjà être normalisé en 3NF (et même BCNF et 4NF), mais vous décidez de le diviser davantage pour la raison de l'optimisation physique.
One way to partition data
horizontalement , en utilisant la syntaxe Oracle:
create table data (
id integer primary key,
status char(1),
data1 varchar2(10),
data2 varchar2(10) )
partition by list (status) (
partition active_data values ( 'A' ),
partition other_data values(default)
);
cela indiquerait au SGBD de stocker à l'interne la table data
en deux segments (comme deux tables), selon la valeur de la colonne status
. Cette façon de le partitionnement data
peut être appliqué, par exemple, lorsque vous n'interrogez que les lignes d'une partition, par exemple, les lignes d'État 'A' (appelons-les lignes actives). Comme précédemment, les scans complets seront plus rapides (en particulier s'il n'y a que peu de lignes actives), les lignes actives (et les autres lignes resp.) sont stockés de manière contiguë (ils ne seront pas dispersés autour des pages qu'ils partagent avec des lignes d'une valeur d'état différente, et il est plus probable que les lignes actives seront dans le cache de la page.
partitionnement Horizontal dans la base de données
garder tous les champs par exemple: Table Employees
a
- id,
- nom,
- l'emplacement Géographique, le "1519130920 mail",
- désignation,
- téléphone
par exemple:1.Conserver tous les champs et distribuer les documents dans plusieurs machines.dire id= 1-100000 ou 100000-200000 enregistrements dans une machine chacun et la distribution sur plusieurs machines.
par exemple:2.Conserver des bases de données distinctes pour les régions,p. ex. Asie-Pacifique, Amérique du Nord
Clé: Ensemble de lignes de sélection basé sur un critère
partitionnement Vertical dans la base de données
il est similaire à la normalisation où le même tableau est divisé en plusieurs tables et utilisé avec jointures si nécessaire.
par exemple:
id
, name
, designation
est mis dans une table et
phone
, email
qui ne peuvent pas être fréquemment consultés sont mis dans un autre.
clé:sélection d'un ensemble de colonnes sur la base d'un critère.
- L'échelle horizontale / verticale est différente de partitionnement
Mise À L'Échelle Horizontale:
est d'environ ajouter plus de machines à permet d'améliorer la réactivité et la disponibilité de tout système, y compris la base de données.L'idée est de distribuer la charge de travail sur plusieurs machines.
Mise À L'Échelle Verticale:
est d'ajouter plus de capacité dans le forme de CPU, Mémoire à la machine ou aux machines existantes pour permettre une meilleure réactivité et disponibilité de n'importe quel système, y compris la base de données.Dans une machine virtuelle configurée, elle peut être configurée virtuellement au lieu d'ajouter de vraies machines physiques.
Sameer Sukumaran
la différence entre la normalisation et la division réside dans le but de le faire.
le but principal de la normalisation est d'éliminer les données redondantes où comme le but du dédoublement de rangée est de séparer les données moins nécessaires.
eg: - supposons que vous ayez une table All_Details avec colonnes-id , Emp_name, Emp_address, Emp_phNo ,Emp_other_data, Company_Name , Company_Address , Company_revenue.
Maintenant, si vous voulez normalisez la table vous créeriez deux nouvelles tables Employee_Details et Company_Details et conserveriez une clé étrangère de company_id dans la table Employee_Details. de cette façon, les données redondantes de l'entreprise seront supprimées .
parlons maintenant de la séparation des rangs. Même après la normalisation, vous n'accédez qu'à employee_name et emp_phNo, mais vous n'ACCÉDEZ PAS à emp_address et emp_other_data si souvent. Pour améliorer les performances, vous divisez la table Employee_Details en deux. Tableau1 contenant les données les plus fréquentes( employee_name et emp_phNo ) et tableau2 contenant les données les moins fréquentes( Emp_address, Emp_other_data) . Les deux tables auront la même colonne unique_key de sorte que vous pouvez recréer n'importe quelle ligne de table Employee_Details avec unique_key. Cela peut améliorer drastiquement les performances de votre système.
les problèmes avec une base de données unique se pose quand elle commence à devenir énorme. Il est donc nécessaire de le cloisonner, de réduire l'espace de recherche, afin qu'il puisse exécuter les actions requises plus rapidement.Il existe différentes stratégies de partitions disponibles par exemple: partitionnement horizontal, partitionnement vertical, partitionnement basé sur le hachage, partitionnement basé sur la recherche. L'échelle horizontale et verticale est un concept différent par rapport à ces stratégies.
-
Horizontal partitionnement : il divise la table/collection donnée en plusieurs tables/collections basées sur certaines informations clés qui peuvent aider à obtenir la bonne table que le partitionnement horizontal aura plusieurs tables sur différents noeuds/machines. par exemple: informations sur les utilisateurs au niveau régional.
-
partitionnement Vertical : il divise les colonnes en plusieurs parties comme mentionné dans l'une des réponses ci-dessus par exemple: colonnes liées à l'information de l'utilisateur, j'aime, je commente, j'ai des amis, etc. dans l'application de réseautage social.
-
partitionnement basé sur le Hash : il utilise la fonction de hash pour décider table/noeud, et prendre des éléments clés comme entrée dans la production de hash. Si nous changeons le nombre de tableaux, il faut réorganiser les données, ce qui est coûteux. Il y a un problème lorsque vous voulez ajouter plus de table/nœud.
-
partitionnement basé sur la recherche : il utilise une table de recherche qui aide à rediriger vers différentes tables/Bases de noeuds sur des champs d'entrée donnés. Nous pouvons facilement ajouter une nouvelle table / noeud dans cette approche.
mise à l'échelle Horizontale vs mise à l'échelle verticale : Lorsque nous concevons une application, nous devons également penser à la mise à l'échelle. Comment allons-nous gérer énorme quantité de trafic à l'avenir? Nous devons penser en termes de consommation de mémoire, latence, utilisation cpu, défaut tolérance, résilience. La mise à l'échelle verticale ajoute plus de ressources par exemple: cpu, mémoire à une seule machine pour qu'elle puisse gérer le trafic à venir. Mais il y a des limites à cette approche, vous ne pouvez pas ajouter plus de ressources que certaines limites. La mise à l'échelle horizontale permet au trafic à venir de se répartir entre plusieurs nœuds. Il a besoin d'avoir un équilibreur de charge à l'avant qui traite essentiellement le trafic, et de naviguer le trafic à n'importe quel noeud. La mise à l'échelle horizontale vous permet d'ajouter assez de serveurs, mais vous aussi besoin de ces nombreux nœuds.