web-dev-qa-db-ja.com

同じプロジェクトでリレーショナルデータベースと非リレーショナルデータベースを使用していますか?

現在取り組んでいるプロジェクトで問題が発生しました。基本的にはGPS座標に基づいて経路を保存するアプリです。アプリはAndroidで実行されます。GPSの位置を毎秒保存し、APIに送信します。保存されたすべての位置のレコードを挿入すると、テーブルの多くのレコードに記録されると思いますたとえば、週に3回1時間実行した場合、1週間に10'800の新しいレコードが存在することになりますが、1年間に1000人のアクティブユーザーがいることを想像してみてください...

とにかく、私はこれまでに見たことのないアイデアを思いついたので、それが良いことかどうか確信が持てません。

リレーショナルデータベース(MySql)を使用してユーザー(および記録されたパスに期待される他のすべてのデータ)を格納し、ユーザーを記録されたパス(明らかに)にリンクするusers_pathsテーブルを持っています。パス自体はnoSql(MongoDB )このようなドキュメントのデータベース:

_id:3474348347389,
waypoints:{
  {lat, long},
  {lat, long},
  ...
} 

それは間違っていて、私にはやり過ぎのように感じるので、まだ実装していません。記録したパスをjsonファイルとして保存することも考えましたが、その解決策にも満足できません。

どう思いますか?これは「進むべき道」ですか、それとも私は完全に間違っていますか?

2
Jonas Wirth

たとえば、週に3回1時間実行すると、1週間に10'800の新しいレコードが存在することになります。ここで、1年間に1000人のアクティブユーザーがいることを想像してください。

まあ、想像しないのではなく、実際にデータの増加を推定しましょう。各GPS座標が2つの32ビット変数に格納されていると想像してください(十分な大きさです。おそらくそれほどの精度は必要ありません)。週3時間は、10,800レコード、つまり675 KBのメモリを意味します。 1,000ユーザーの場合、1週間あたり659.18 MBのデータ増加、つまり1か月あたり2.6 GB、または1年あたり33.57 GBのデータを取得します。

したがって、2 TBの容量のハードディスクを埋めるにはsixty yearsかかります。

元の質問に戻ります。このような小さなデータのセットでは、RDBMSと非リレーショナルデータベースのどちらを選択するかは重要ではありません。使い慣れたものを選んでください。

7

特定のユースケースでは、2つの異なるデータベースを使用しません。ユーザーのパスをジオメトリとしてRDBMS(MySQLまたはPostgres)に保存するだけです。最新のリレーショナルデータベースは地理空間データ型をサポートし、快適なアクセスを可能にします。このようにして、データベースで地理空間分析(実行時間、速度、他のユーザーとの交差など)を行うことができます。

独自のカスタムジオメトリデータタイプを作成しようとすること(つまり、mongodbである種のドキュメントスキーマを定義すること)は、「ホイールの再発明」の典型的な例です。主要なデータベースエンジンはすべて、ジオメトリとジオデータの保存、クエリ、操作に優れています。

オープンソースデータベースを使用する場合は、 PostGIS または MySQLの空間拡張 を参照してください。 OracleとMSSQLはどちらも空間データをサポートしています。

この方法で行うと、WMS、WFS、またはその他の種類の空間レンダリングとして公開するなどの標準的なツールでデータを使用できます。

3
germi

確実に知る唯一の方法は、両方を実装して、負荷テスト中に測定することです。

しかし直感的には、DBMSのどれも関連するデータアクセスに対してグローバルな最適化を行うことができないため、2つの異なるデータベースをいじるのは良い考えではないと思います。これはやり過ぎであり、パフォーマンスはそれほど向上しません。

すべてのデータをmongoDBに入れるか、すべてのデータをrdbmsに入れます。 MongoDBモデルは問題ありません。 rdbmsの場合、ウェイポイントテーブルを使用できます。あなたが引用した数字は検索の問題ではありません。 Rdbmsは、このようなデータを大量処理するように設計されています。

Rdbmsシナリオでパスの単一ポイントへのデータベースアクセスが必要ない場合は、フルパスを単一のblob(gps座標ストリームのバイナリストレージ)として保存することを選択できます。これにより、データベースがこのロットを解釈するのを回避できます。各行のフェッチでデータの。このblobは、rdbmsのブラックボックスになります。これは、パスをグラフィカルにレンダリングしたり、距離や速度、セグメント速度などの属性を計算したりするためにアプリによって処理されます。

パスの単一ポイントにdbクエリでアクセスする場合(たとえば、2人のランナーが同様のパスを使用しているか、相互に交差するかどうかを確認する場合)、gpsの解像度と精度によっては、単一ポイントでは不十分な場合があります。とにかく。次に、地理空間クエリとインデックスをサポートするデータベースエンジンをより適切に使用する必要があります(例: MongoDB または Aerospike

1
Christophe