VMDSは、 GE EnergyがSmallworldテクノロジープラットフォームの一部として提供する、バージョン管理データストアと呼ばれるリレーショナルデータベース技術の略称であり、電力配給や通信などの企業ユーティリティが通常使用する非常に複雑な空間ネットワークとトポロジーネットワークを保存および分析するために最初から設計されました。[ 1 ]
VMDSは1990年に初めて導入され、その後長年にわたって改良とアップデートが重ねられてきました。現在のバージョンは6.0です。
VMDSは空間データベースとして設計されています。そのため、従来の属性のみを扱うリレーショナルデータベースと比較して、VMDSは多くの特徴を備えています。
VMDSは、 SWMFS (Smallworld Master File Server)と呼ばれるシンプルで拡張性の高いデータブロックサーバーと、 C言語とMagikで記述されたインテリジェントなクライアントAPIの2つの部分で構成されています。空間データと属性データは、サーバー上のデータストアファイルと呼ばれる特殊なファイルに格納されたデータブロックに保存されます。クライアントアプリケーションがデータを要求すると、必要なデータブロックの最適なセットを算出するのに十分なインテリジェンスを備えています。この要求はSWMFSに送信され、SWMFSはネットワーク経由でクライアントにデータを返します。
このアプローチは、空間データやトポロジーデータを扱う際に特に効率的で拡張性に優れています。これらのデータは、通常の属性データよりも大量のデータとして流れ、より多くの処理を必要とする傾向があります(例えば、地図の再描画処理時など)。このアプローチにより、VMDSは数百、あるいは数千もの同時接続クライアントを抱えるエンタープライズ環境への導入に最適です。
リレーショナルデータベースは、データの変更が比較的小さく、実行時間も短い(トランザクションの開始から終了までの最大期間は通常数秒以下)短いトランザクションをサポートしています。
VMDSは、トランザクションに含まれるデータ量が膨大で、トランザクションの期間が長い(数日、数週間、あるいは数ヶ月に及ぶ場合もある)長時間のトランザクションをサポートしています。このようなトランザクションは、例えば電力配給会社などが使用する高度なネットワークアプリケーションでよく見られます。
この状況ではトランザクションに時間がかかるため、変更量も大きくなる可能性があります(トランザクションの範囲内だけでなく、データベース全体においても)。そのため、同じレコードが複数回変更される可能性が高くなります。VMDSはこのような状況に対応するため、競合を自動的に管理する機能を内蔵しており、アプリケーションが変更内容を確認し、正しい編集のみを受け入れることができます。
VMDSは、属性クエリ、結合フィールド、トリガー、計算フィールドといった従来のリレーショナルデータベースの機能に加え、数多くの空間的およびトポロジー的な機能を備えています。これにより、点、テキスト、ポリライン、ポリゴン、ラスターデータなどの空間データを保存および分析することが可能です。
空間機能には、ポリゴン内のすべてのフィーチャの検索、一連のサイトのボロノイポリゴンの計算、および一連の点に対するクラスタ分析の実行が含まれます。
点、ポリライン、ポリゴンなどのベクトル空間データには、複雑なネットワークをモデル化できるトポロジー属性を付与できます。ネットワーク分析エンジンは、2つのノード間の最短経路の探索や配送ルートの最適化(巡回セールスマン問題)といった疑問に答えるために提供されます。トポロジーエンジンは、新しいデータが追加されたり、既存のデータが編集されたりする際に、トポロジーエンティティ同士がどのように相互作用するかを定義する一連のルールで構成できます。
VMDSでは、すべてのデータはオブジェクトとしてアプリケーションに提示されます。これは、JDBCなどを使用してテーブルの行またはクエリ結果としてデータを提示する多くのリレーショナルデータベースとは異なります。VMDSは、 Smallworldテクノロジープラットフォームの一部としてデータモデリングツールと基盤となるインフラストラクチャを提供し、管理者がデータベース内のテーブルをMagikのエグゼンプラー(またはクラス)に関連付けることを可能にします。MagikエグゼンプラーのMagikのgetメソッドとsetメソッドは自動的に生成され、テーブルのフィールド(または列)を公開します。VMDSの各行は、Magikオブジェクトのインスタンスとしてアプリケーションに現れ、 RWO (実世界オブジェクト)と呼ばれます。Smallworldでは、テーブルはコレクションと呼ばれます。
# all_rwos はデータベース内のすべての rwos を保持し、異種混在型です all_rwos << my_application.rwo_set() # valve_collection にはバルブコレクションが格納されます バルブ << all_rwos.select(:collection, {:valve}) number_of_valves << valves.sizeクエリは述語オブジェクトを使用して構築されます。
# 開いているバルブを探します。 open_valves << valves.select(predicate.eq(:operating_status, "open")) number_of_open_valves << open_valves.size
_for valve _over open_valves.elements() _ループ write(valve.id) _endloop
結合は親RWOのメソッドとして実装されます。たとえば、マネージャーには複数の部下がいる場合があります。
# 従業員コレクションを取得します。 employees << my_application.database.collection(:gis, :employees)
# 「Steve」という名前のマネージャーを見つけて、最初に一致する要素を取得する steve << employees.select(predicate.eq(:name, "Steve").and(predicate.eq(:role, "manager")).an_element()
# 彼の直属の部下の名前を表示します。name はフィールド (または列) です。 # 従業員コレクション(またはテーブル)について _従業員_スティーブの直属の部下要素() _ループ write(employee.name) _endloop
取引の実行:
# ハッシュテーブル内の各キーは、フィールド (または列) の名前に対応します。 # コレクション(またはテーブル) valve_data << hash_table.new_with( :asset_id、57648576、 :材質、「鉄」
# バルブコレクションを直接取得する valve_collection << my_application.database.collection(:gis, :valve)
# コレクションに新しいバルブレコードを挿入するための挿入トランザクションを作成します。 # 取引内容を説明するコメントを記載できます トランザクション << record_transaction.new_insert(valve_collection, valve_data, "新しいバルブを挿入しました") トランザクションの実行