1

C++ でテーブルまたはリレーション (一意の行を持つ順序付けられていないテーブル) のデータ構造を構築しようとしています。これまで何度も使ってきましたが、自分で作ったことはありません。

したがって、テーブルは、任意の型の任意の数の列のコレクションである必要があります。またはいくつかの派生クラスを使用std::vector<some_type>して、列を表すことができます。

私の質問は、包括的なテーブル データ構造を定義するために、どの言語構造を使用できるかということです。基本クラスから派生できるクラスにラップstd::vector<some_type>して、テーブルを基本クラスへのポインターのベクトルとして表すことができることはわかっていますが、表現を行うための代替方法があるかどうかを知りたいと思っています。 、おそらくいくつかのテンプレート署名を使用していますか?テーブルの列を使用するときは、キャストしすぎないようにします。

背景を説明します。私が説明している種類の既存のデータ構造を喜んで使用します。このような構造がソフトウェア業界でリレーショナル代数アルゴリズムに非常に積極的に使用されるのを見てきましたが、たとえばブーストではそのような構造は見つかりませんでした。結合、製品などの基本的な関係演算子の実装に特に興味があります...

編集:いくつかの詳細。行ベースのメモリ連続性を持つデータ構造を作成したくありません。連続性が列ベースであることが重要であるため、ベクトルのコレクションを持つことは正しいことのようです。

4

1 に答える 1

1

使用するデータ構造は、最も一般的に実行するリレーショナル操作によって異なります。

たとえば、2 つのテーブルで結合を実行する場合、これを行うには複数の方法があります。ネストされたループ結合を使用できます。この場合、特定のキーでテーブル内の特定の行にすばやくアクセスする必要はありません。一方、ハッシュ結合を使用すると、指定したキーで特定の行をすばやく取得できます。

ただし、使用する結合の種類の選択は、クエリの最適化に関連する問題であり、いくつかの要因 (データベース内のデータのカーディナリティの推定など) があります。

しかし、一般的に、私は次のことを行います:

  1. データ内の行を表すオブジェクトを作成します。このオブジェクトには、さまざまな列のリストを含めることができます。操作を頻繁に実行する単一のキーがある場合は、それを独自の変数に格納します。それ以外の場合は、高速検索のために列値のハッシュセットを保存できます (これは、多数の列がある場合にのみ価値があります)。
  2. このオブジェクトでデータの「行」を表すようになったら、最も頻繁に行う操作の種類を決定します。たとえば、並べ替えが必要な操作が必要な場合は、赤黒ツリーを実装する stl mapを使用して特定のキーでこれらの行を格納し、キーを効率的に取得できます。特定の時間に特定の行に高速にアクセスする必要がある場合 (たとえば、クエリのフィルターのため)、hashmapを使用できます。

tl/dr: 行を最適に格納する方法は、最も頻繁に予想される操作の種類とデータの分散によって異なります。いずれにせよ、「行」の概念を格納するクラスを作成し、ユースケースに応じてさまざまなデータ構造でこれらの行を配置することが論理的だと思います。

于 2013-01-31T19:31:25.690 に答える