web-dev-qa-db-ja.com

データベースのパーティション分割-水平対垂直-正規化と行分割の違い?

Database Partitioningのさまざまな概念を把握しようとしていますが、これは私が理解したことです:

Horizo​​ntal Partitioning/Sharding:テーブルを、最初のテーブルにあった行のサブセットを含む別のテーブルに分割する(私が見た例)北米用のサブテーブル、ヨーロッパ用の別のテーブルなど、大陸ごとにユーザーテーブルを分割する場合は多数)。各パーティションは異なる物理的な場所にあります(「マシン」を理解してください)。私が理解したように、水平分割とシャーディングはまったく同じものです(?)。

Vertical Partitioning:私が理解したことから( http://technet.Microsoft.com/en-us/library/ms178148%28v= sql.105%29.aspx )、2種類の垂直パーティションがあります。

  • 正規化(テーブルを分割して外部キーでリンクすることにより、データベースから冗長性を削除します)。

  • 行分割、これは私が理解していないことです、正規化の違いは何ですか行分割?これらの2つの手法はどのように異なっていますか?

また、私はこの投稿で読んだことがあります( データベースの水平方向と垂直方向のスケーリングの違い )既存のマシンに電力(CPU、RAM)を追加することでスケーリングしますが、それは正しい定義ですか?これらの2つの手法のcoreの違いは、テーブルを分割する方法にあると考えました。

たくさんの質問をおかけして申し訳ありませんが、私が遭遇した多くの異なるウェブサイトが異なることを言っているので、少し混乱しています。

明確にする助けをいただければ幸いです。いくつかのテーブルがある明確でシンプルなデモへのリンクも非常に役立ちます。

34
dukable

パーティション分割はかなり一般的な概念であり、多くのコンテキストに適用できます。リレーショナルdataのパーティション化を考慮する場合、通常は行方向(水平方向)または列方向(垂直方向)にテーブルを分解することを指します。

垂直分割(別名行分割)は、データベースの正規化と同じ分割手法を使用しますが、通常(垂直/水平)データ分割という用語は物理最適化を指します一方、正規化はconceptualレベルでの最適化です。

簡単なデモンストレーションを要求するので、次のようなテーブルがあると仮定します。

create table data (
    id integer primary key, 
    status char(1) not null, 
    data1 varchar2(10) not null, 
    data2 varchar2(10) not null);

dataをパーティション分割する1つの方法垂直方向:次のように分割します。

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) );

この種のパーティション分割は、たとえば、クエリで列データ2がほとんど必要ない場合に適用できます。パーティションdata_mainのスペースは少なくなるため、テーブル全体のスキャンは高速になり、DBMSのページキャッシュに収まる可能性が高くなります。欠点:dataのすべての列をクエリする必要がある場合、テーブルを結合する必要があるため、元のテーブルをクエリするよりもコストが高くなります。

テーブルを正規化するときと同じ方法で列を分割していることに注意してください。ただし、この場合、dataはすでに3NF(さらにBCNFと4NF)に正規化できますが、物理的な最適化のためにさらに分割することにします。

Oracle構文を使用してdatahorizo​​ntallyをパーティション分割する1つの方法:

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) 
    );

これは、列dataの値に応じて、テーブルstatusを2つのセグメント(2つのテーブルなど)に内部的に格納するようにDBMSに指示します。このパーティション分割dataの方法は、たとえば、通常は1つのパーティションの行のみを照会する場合、たとえば、ステータス「A」行(アクティブ行と呼びましょう)に適用できます。前と同様に、フルスキャンは高速になり(特にアクティブな行が少ない場合)、アクティブな行(および他の行はそれぞれ)が連続して格納されます(異なる行と共有するページに散らばることはありません)ステータス値、およびアクティブな行がページキャッシュにある可能性が高くなります。

27
Fabian

データベースの水平分割

すべてのフィールドを保持しますEG:Table Employees has

  • id、
  • 名、
  • 地理上の位置 、
  • eメール、
  • 指定、
  • 電話

EG:1。すべてのフィールドを維持し、複数のマシンにレコードを配布します。たとえば、id = 1〜100000または100000〜200000のレコードをそれぞれ1つのマシンに配置し、複数のマシンに分散します。

EG:2。地域ごとに個別のデータベースを保持EG:アジア太平洋、北米

キー:基準に基づいた行の選択

データベースの垂直分割

同じテーブルが複数のテーブルに分割され、必要に応じて結合で使用される正規化に似ています。

EG:idnamedesignationは1つのテーブルに配置され、
phoneemailは頻繁にアクセスされない可能性があり、別の場所に配置されます。

キー:基準に基づいて列のセットを選択します。

  • 水平/垂直スケーリングはパーティショニングとは異なります

水平スケーリング:

より多くのマシンを追加データベースを含むシステムの応答性と可用性の向上を可能にします。アイデアは、作業負荷を複数のマシンに分散することです。

垂直スケーリング:

仮想マシンのセットアップでは、実際の物理マシンを追加する代わりに仮想的に構成できます。

サメール・スクマラン

20

単一のデータベースの問題は、巨大になり始めるときに発生します。必要なアクションをより高速に実行できるように、検索スペースを削減するためにパーティションを分割する必要があります。たとえば、水平分割、垂直分割、ハッシュベースの分割、ルックアップベースの分割など、さまざまなパーティション戦略が利用できます。水平、垂直スケーリングは、これらの戦略とは異なる概念です。

  1. 水平分割:水平分割には異なるノード/マシンに複数のテーブルがあるため、適切なテーブルを取得するのに役立ついくつかの重要な情報に基づいて、特定のテーブル/コレクションを複数のテーブル/コレクションに分割します。例:地域ごとのユーザー情報。

  2. 垂直分割:上記の回答のいずれかに記載されているように、列を複数の部分に分割します。たとえば、ソーシャルネットワーキングアプリケーションのユーザー情報、いいね、コメント、友人などに関連する列です。

  3. ハッシュベースのパーティション分割:ハッシュ関数を使用してテーブル/ノードを決定し、ハッシュを生成する際の入力としてキー要素を使用します。テーブルの数を変更すると、データの再配置が必要になり、費用がかかります。したがって、さらにテーブル/ノードを追加する場合に問題があります。

  4. ルックアップベースのパーティション分割:ルックアップテーブルを使用して、指定された入力フィールドに基づいて異なるテーブル/ノードにリダイレクトします。このアプローチでは、新しいテーブル/ノードを簡単に追加できます。

水平スケーリングvs垂直スケーリング:アプリケーションを設計するときは、スケーリングも考慮する必要があります。今後、大量のトラフィックをどのように処理するのでしょうか?メモリ消費、レイテンシ、CPU使用率、フォールトトレランス、復元力の観点から考える必要があります。垂直スケーリングにより、たとえばCPU、メモリが単一のマシンに追加され、着信トラフィックを処理できるようになります。ただし、このアプローチには制限があり、特定の制限を超えるリソースを追加することはできません。水平スケーリングにより、着信トラフィックを複数のノードに分散できます。基本的にトラフィックを処理するロードバランサーを前面に配置し、トラフィックを任意の1つのノードにナビゲートする必要があります。水平スケーリングでは、十分な数のサーバーを追加できますが、これらの多数のノードも必要になります。

1
Bhagwati Malav

正規化と分割の違いは、そうする目的にあります。

正規化の主な目的は、冗長データを削除することです。行分割の目的は、必要性の低いデータを分離することです。

例:-列id、Emp_name、Emp_address、Emp_phNo、Emp_other_data、Company_Name、Company_Address、Company_revenueを持つテーブルAll_Detailsがあるとします。

テーブルを正規化する場合、2つの新しいテーブルEmployee_DetailsとCompany_Detailsを作成し、company_idの外部キーをテーブルEmployee_Detailsに保持します。これにより、冗長な企業データが削除されます。

次に、行の分割について説明します。正規化した後でも、employee_nameとemp_phNoにしかアクセスしていないが、emp_addressとemp_other_dataにはそれほど頻繁にアクセスしていないとしましょう。したがって、パフォーマンスを改善するために、Employee_Detailsテーブルを2つのテーブルに分割します。頻繁に必要なデータ(employee_nameおよびemp_phNo)を含むtable1と、あまり頻繁に必要でないデータ(Emp_address、Emp_other_data)を含むtable2両方のテーブルに同じunique_key列があるため、テーブルEmployee_Detailsの任意の行をunique_keyで再作成できます。これにより、システムのパフォーマンスが大幅に向上します。

0
hummer