データスキーマを設計する際には、後の変更の余地を考慮して設計するのが望ましいですが、新しい機能を追加するにはカラムを新たに追加する必要があります。初めから余裕を持って設計すると、逆に未使用のカラムがスペースを取ってしまうという問題が生じることもあります。各NoSQLデータベースを比較すると、スキーマの柔軟性には大きな違いがあり、固定スキーマを持つデータベースもあれば、すべてのレコードが異なるスキーマを持つデータベースもあります。GridDBはその中間の特徴があり、簡単に変更できる固定スキーマを持っています。
このブログでは、以前のブログ記事 GridDBを使用したニューヨークの犯罪データの地理空間分析のスキーマ定義を使って説明します。
コンテナのスキーマを表示する
コンテナのスキーマを変更するには、ContainerInfo と ContainerColumnList オブジェクトを取得する必要がありますが、これらのオブジェクトは変更されてコンテナに書き戻されます。まずはContainerColumnListを表示します。
ContainerInfo conInfo = store.getContainerInfo("COMPLAINTS"); List newColumnList = new ArrayList(); for ( int i = 0; i < conInfo.getColumnCount(); i++ ){ System.out.println(conInfo.getColumnInfo(i).getName()); }
カラムを追加する
カラムを追加するには、任意のJava Listメソッドを使用することができます。次の例は、スキーマ変更の実例で、スキーマにアドレスを追加しています。当初緯度と経度のみを格納し、何年にもわたってデータを収集した後、それらの地点に関するGeoCoded情報も後から格納したい場合にこういった操作が必要となります。
ContainerInfo conInfo = store.getContainerInfo("COMPLAINTS"); List newColumnList = new ArrayList(); for ( int i = 0; i < conInfo.getColumnCount(); i++ ){ newColumnList.add(conInfo.getColumnInfo(i)); } newColumnList.add(new ColumnInfo("ADDRESS", GSType.STRING)); conInfo.setColumnInfoList(newColumnList); store.putCollection("COMPLAINTS", conInfo, true);
カラムを削除する
データを追加するのと同様に、Java List APIを使用して、ColumnListからColumnInfo行を削除することができます。データのコピーを作成しているので、以下のようにコピー中にnewColumnListを変更することができます。
ContainerInfo conInfo = store.getContainerInfo("COMPLAINTS"); List newColumnList = new ArrayList(); for ( int i = 0; i < conInfo.getColumnCount(); i++ ){ if(!conInfo.getColumnInfo(i).getName().equals("VIC_AGE_GROUP")) newColumnList.add(conInfo.getColumnInfo(i)); } conInfo.setColumnInfoList(newColumnList); store.putCollection("COMPLAINTS", conInfo, true);
カラムの表示、追加、削除のためのJavaプログラムは、こちらからダウンロードできます。
ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb