私は国勢調査データを使用して、いくつかのCSVファイルをダウンロードしました。各CSVファイルには、600個の列/変数が含まれています。それらすべてをクエリ可能なデータベースに格納したいのですが、これまでに試したすべての操作(MS Access、Arcジオデータベーステーブル)では、テーブルが256列に切り捨てられます。DBAではない誰かがアクセスできる大きなテーブルを処理するためのソリューションはありますか?
私は国勢調査データを使用して、いくつかのCSVファイルをダウンロードしました。各CSVファイルには、600個の列/変数が含まれています。それらすべてをクエリ可能なデータベースに格納したいのですが、これまでに試したすべての操作(MS Access、Arcジオデータベーステーブル)では、テーブルが256列に切り捨てられます。DBAではない誰かがアクセスできる大きなテーブルを処理するためのソリューションはありますか?
回答:
PostgreSQLの列の制限は「列タイプに応じて」250〜1600で、空間データとPostGIS拡張機能によるクエリをサポートします。だから私は2つのことをする傾向があります:
まず、列がフリーテキストではなくカテゴリを表す場合は、それらのカテゴリで別のテーブルを作成し、カテゴリテーブルを参照して、列を整数IDおよび外部キー制約に置き換えます。
次に、大きなテーブルを論理的に2つ以上に分割して第3正規形を壊し、それらの間に1対1の関係を設定します。これはおそらく最も効率的ではありませんが、データの一部がほとんど必要ない場合は、クエリは必要なテーブルに対してのみ実行できます。
別の完全に異なる代替案は、MongoDB、CouchDBなどの「NOSQL」データベースを使用することです。「行」のサイズに固定された制限はなく、レコードのデータが存在しない場合でも、領域を占有する必要はありません。
これらのタイプのビッグテーブルデータベースの空間サポートはそれほど良くありませんが、MongoDBは2D空間クエリとデータをサポートしており、CouchDBは同様の機能を持っているようです。
最近、2172列を含むStatistics Canadaの国勢調査プロファイルCSVファイルでまったく同じ問題に対処しました。ArcGISにアクセスできる場合は、csvをESRIファイルジオデータベース(FGDB)にインポートできます。ESRIによると、FGDB形式は、フィーチャクラスまたはテーブルの65,534フィールドを処理できます。
私の場合、2172列の幅のCSVファイルを問題なくFGDBテーブルにインポートできました。
テーブル全体をFGDBに入れたら、好きな方法で(たとえば、論理的またはデータベースの制限に基づいて)スライスして、一意のID列を維持し、次のように結合できるようにします。必要。
短い:
多くの属性を持つ、または各オブジェクトの変数属性タイプを持つデータの私のオプションは、KEY / VALUEデータモデルを使用することです。これは、SQLで実装でき、非常にうまく機能します(postgresql + postgisをお勧めします)。
説明:
1)ポイント、たとえば、フィーチャのテーブルが1つあります。このテーブルには、各ポイントのIDとジオメトリが保持されます。
2)キー/値のペアである「属性」のテーブルがもう1つあります。このテーブルには、ID、POINT_ID(FK)、KEY(varchar)、VALUE(varchar)の列があります。
これで、各ポイントは、そのように格納された実質的に無限の属性を持つことができます。
ID POINT_ID KEY VALUE
1 1 type burger shop
2 1 name SuperBurger
3 1 address 123, a ST.
OpenStreetMapsはそのように機能し、非常にうまく機能します。こことここを参照してください。
データをインポートするには、Pythonスクリプトをお勧めします。