(57)【要約】  高速コピー可能データベース機器が、プロセッサ及びプロセッサと電子通信するメモリを含む。メモリは、バージョン識別子を含む複合キーをそれぞれ有する複数のレコードを有するデータベーステーブルを記憶する。メモリは、データベーステーブルの第１の仮想クローン及びデータベーステーブルの第２の仮想クローンを生成すること、第１の仮想クローンにおいてクエリを受信すること、及びクエリが第１の仮想クローンのバージョン識別子を含むようにクエリを修正することをプロセッサに行わせるために実行可能な命令も記憶する。プロセッサは修正済みのクエリを使用してデータベーステーブルをクエリして、第１の仮想クローンのバージョン識別子の祖先パスに関連するバージョン識別子を有する１組のレコードからの各レコードに部分的に基づく応答を生成し、その応答を送信することができる。各複合キーはバージョン識別子及びデータ部分を含む。
2021501931.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサと、
前記プロセッサと電子通信するメモリであって、複数のレコードを含むデータベーステーブルを記憶し、前記複数のレコードからの各レコードはバージョン識別子を含む複合キーを有する、メモリと
を含む機器であって、前記メモリは
前記データベーステーブルの第１の仮想クローン及び前記データベーステーブルの第２の仮想クローンを生成すること、
前記第１の仮想クローンにおいてクエリを受信すること、
前記第１の仮想クローンにおいて前記クエリを受信することに基づいて前記第１の仮想クローンに関連するバージョン識別子を含む修正済みのクエリを定めるために前記クエリを修正すること、
（１）前記クエリを満たす１組のレコードからの各レコード、及び（２）前記第１の仮想クローンに関連する前記バージョン識別子の祖先パスに関連するバージョン識別子を有する前記１組のレコードからの各レコードに基づき、前記複数のレコードからの前記１組のレコードを含む応答を生成するために前記修正済みのクエリを使用して前記データベーステーブルをクエリすること、
前記クエリへの応答として前記１組のレコードを含む前記応答を送信すること
を前記プロセッサに行わせるために実行可能な命令を含み、
前記複数のレコードからの各レコードの前記複合キーが、その複合キーの前記バージョン識別子及びデータ部分を含み、前記複数のレコードは、（１）前記データ部分の値及び前記第１の仮想クローンに関連する前記バージョン識別子を含む複合キー、又は（２）前記データ部分の前記値及び前記第２の仮想クローンに関連する前記バージョン識別子を含む複合キーのうちの１つだけが任意の所与の時点において前記データベーステーブル内に存在するように構成される、
機器。
【請求項２】
前記メモリが、
前記第１の仮想クローンによって受信される挿入命令に応答して前記データベーステーブルにレコードを追加することであって、前記レコードは、データ及び前記第１の仮想クローンに関連するバージョン識別子を有する複合キーを含み、そのため（１）前記第１の仮想クローンにおいて後で受信され前記データを参照するクエリが前記レコードを返し、（２）前記データを求めて第３の仮想クローンにおいて後で受信されるクエリは前記レコードを返さない、追加すること
を前記プロセッサに行わせるために実行可能な命令を更に含む、請求項１に記載の機器。
【請求項３】
前記命令が、
前記データベーステーブルの第１のレコードのフィールドの値を第１の値から第２の値に更新するための、及び第３の仮想クローンによって受信される命令に応答し、前記データベーステーブルに第２のレコードを追加することであって、前記第２のレコードは前記第２の値及び前記第３の仮想クローンに関連するバージョン識別子を有する複合キーを含む、追加すること、及び
前記第１のレコードの前記フィールドの前記値を更新するための前記命令に応答し、前記第３の仮想クローンに関連する前記バージョン識別子を含まないように前記第１のレコードの複合キーを修正することであって、そのため
前記第３の仮想クローンにおいて後で受信され、前記フィールドを参照するクエリが前記第２のレコードを返し、
前記第１の仮想クローンにおいて受信され、前記フィールドを参照するクエリが前記第１のレコードを返す、
修正すること
を前記プロセッサに行わせるために更に実行可能である、請求項１に記載の機器。
【請求項４】
前記命令が、
前記複数のレコードからレコードを削除するための、及び第３の仮想クローンによって受信される命令に応答し、前記第３の仮想クローンに関連するバージョン識別子を含まないように前記レコードの前記複合キーの前記バージョン識別子を修正することであって、そのため
前記第３の仮想クローンにおいて後で受信される前記レコードのためのクエリが前記レコードを返さず、
前記第１の仮想クローンにおいて後で受信される前記レコードのためのクエリが前記レコードを返す、
修正すること
を前記プロセッサに行わせるために更に実行可能である、請求項１に記載の機器。
【請求項５】
前記応答が第１の応答であり、前記修正済みのクエリが第１の修正済みのクエリであり、前記命令は、
前記第１の応答がヌルの場合に前記第２の仮想クローンのバージョン識別子を含む第２の修正済みのクエリを生成することであって、前記第２の仮想クローンは前記第１の仮想クローンにとっての祖先である、生成すること、
（１）前記第２の修正済みのクエリを満たす第２の応答の１組のレコードからの各レコード、及び（２）前記第２の仮想クローンの前記バージョン識別子の祖先パスに関連するバージョン識別子を有する前記第２の応答の前記１組のレコードからの各レコードに基づき、前記複数のレコードからの前記１組のレコードを含む前記第２の応答を生成するために前記第２の修正済みのクエリを使用して前記データベーステーブルをクエリすること、及び
前記クエリへの応答として前記１組のレコードを含む前記第２の応答を送信すること
を前記プロセッサに行わせるために更に実行可能である、請求項１に記載の機器。
【請求項６】
前記命令は、前記第１の仮想クローンが前記第２の仮想クローンの子孫であるという指示を前記メモリ内に記憶することを前記プロセッサに行わせるために更に実行可能である、請求項１に記載の機器。
【請求項７】
前記命令が、前記データベーステーブルの第３の仮想クローンを生成することであって、前記第３の仮想クローンは前記第１の仮想クローンの祖先でも子孫でもなく、前記複数のレコードは前記データ部分の前記値及び前記第３の仮想クローンに関連する前記バージョン識別子を含む複合キーを有するレコードを含む、生成することを前記プロセッサに行わせるために更に実行可能である、請求項１に記載の機器。
【請求項８】
プロセッサと、
前記プロセッサと電子通信するメモリであって、データベーステーブルを記憶する、メモリと
を含む機器であって、前記プロセッサは、
前記データベーステーブルの複数の仮想クローンの表現を含む階層ツリーを生成することであって、前記複数の仮想クローンは第１の仮想クローン、前記第１の仮想クローンの子の仮想クローンである第２の仮想クローン、及び前記第２の仮想クローンの後継仮想クローンである第３の仮想クローンを含む、生成すること、
前記第２の仮想クローンを削除するための命令に応答し、前記階層ツリー内の且つ前記第３の仮想クローンに関連する後継関係を修正すること、
前記第２の仮想クローンを削除するための前記命令に応答して前記第２の仮想クローンを削除すること、及び
前記第２の仮想クローンを削除するための前記命令に応答し、前記第２の仮想クローンの前記削除後に前記第１の仮想クローンが子の仮想クローンを有さない場合、前記複数の仮想クローンから前記第１の仮想クローンを削除すること
を前記プロセッサに行わせるために実行可能な命令を含む、
機器。
【請求項９】
前記複数の仮想クローンが、前記第１の仮想クローンの後継仮想クローンである第４の仮想クローンを更に含み、前記命令は、前記第２の仮想クローンを削除するための前記命令及び前記第２の仮想クローンの削除後に前記第４の仮想クローンが前記第１の仮想クローンの唯一の子孫だという判定に応答し、前記第４の仮想クローンに関連する後継関係を修正することを前記プロセッサに行わせるために更に実行可能である、請求項８に記載の機器。
【請求項１０】
前記命令が、
前記複数の仮想クローンからの且つ子の仮想クローンを有さない第４の仮想クローンを自動で識別すること、及び
前記自動で識別することに基づいて前記第４の仮想クローンを削除すること
を前記プロセッサに行わせるために更に実行可能である、請求項８に記載の機器。
【請求項１１】
前記命令が、
前記複数の仮想クローンからの且つ子の仮想クローンを有さない第４の仮想クローンを自動で識別すること、並びに
前記自動で識別することに応答して
前記複数の仮想クローンからの第５の仮想クローンに関連する後継関係を修正すること、及び
前記第４の仮想クローンを削除すること
を前記プロセッサに行わせるために更に実行可能である、請求項８に記載の機器。
【請求項１２】
前記命令が、前記第３の仮想クローンに関連する前記後継関係を修正することに応答し、前記複数の仮想クローンから少なくとも１つの更なる仮想クローンを削除することを引き起こすことを前記プロセッサに行わせるために更に実行可能である、請求項８に記載の機器。
【請求項１３】
前記後継関係が第１の後継関係であり、前記メモリが前記第１の後継関係を含む複数の後継関係を更に記憶する、請求項８に記載の機器。
【請求項１４】
前記データベーステーブルが複数のレコードを含み、前記複数のレコードからの各レコードが、前記複数の仮想クローンからの仮想クローンに関連するバージョン識別子を含む複合キーを含む、請求項８に記載の機器。
【請求項１５】
プロセッサと、
前記プロセッサと電子通信するメモリであって、データベーステーブルを記憶する、メモリと
を含む機器であって、前記プロセッサは、
前記データベーステーブルの複数の仮想クローンの表現を含む階層ツリーを生成すること、並びに
前記複数の仮想クローンから第１の仮想クローンを削除するための命令に応答し、
第２の仮想クローンに関連する後継関係を修正することであって、前記第２の仮想クローンは前記第１の仮想クローンの後継仮想クローンである、修正すること、
前記第１の仮想クローンを削除すること、
第４の仮想クローンに関連する後継関係を修正することであって、前記第４の仮想クローンは第３の仮想クローンの後継仮想クローンであり、前記第３の仮想クローンは前記第１の仮想クローンの祖先仮想クローンである、修正すること、及び
前記第３の仮想クローンを削除すること
を前記プロセッサに行わせるために実行可能な命令を含む、
機器。
【請求項１６】
前記命令が、
前記第２の仮想クローンが前記第４の仮想クローンの唯一の子孫仮想クローンであり且つ後継仮想クローンだと検出すること、及び
前記第２の仮想クローンが前記第４の仮想クローンの前記唯一の子孫仮想クローンであり且つ前記後継仮想クローンだと検出することに応答して前記第２の仮想クローンを削除すること
を前記プロセッサに行わせるために更に実行可能である、請求項１５に記載の機器。
【請求項１７】
前記データベーステーブルが複数のレコードを含み、前記複数のレコードからの各レコードが、前記複数の仮想クローンからの仮想クローンに関連するバージョン識別子を含む複合キーを含む、請求項１５に記載の機器。
【請求項１８】
前記命令が、前記第１の仮想クローンを削除するための前記命令に応答し、前記複数の仮想クローンから少なくとも１つの更なる仮想クローンを削除することを引き起こすことを前記プロセッサに行わせるために更に実行可能である、請求項１５に記載の機器。
【請求項１９】
前記命令が、
前記複数の仮想クローンからの且つ子孫仮想クローンを有さない第５の仮想クローンを自動で識別すること、並びに
自動で識別することに応答し、
第６の仮想クローンに関連する後継関係を修正すること、及び
前記第５の仮想クローンを削除すること
を前記プロセッサに行わせるために更に実行可能である、請求項１５に記載の機器。
【請求項２０】
前記メモリが、前記第２の仮想クローンに関連する前記後継関係及び前記第４の仮想クローンに関連する前記後継関係を含む複数の後継関係を更に記憶する、請求項１５に記載の機器。
【発明の詳細な説明】
【技術分野】
【０００１】
関連出願の相互参照
[0001]  本願は、参照によりその全開示を本明細書に援用する、２０１７年１１月１日に出願され、「ネットワーク内に分散データベースを効率的に実装するための方法及び機器（Methods and Apparatus for Efficiently Implementing a Distributed Database within a Network）」と題された米国仮特許出願第６２／５８０，０５６号の優先権及び利益を主張する。
【背景技術】
【０００２】
背景
[0002]  本明細書に記載する実施形態は、一般に効率を高めたデータベースシステムを実装するための方法及び機器に関する。
【発明の概要】
【課題を解決するための手段】
【０００３】
概要
[0003]  一部の実施形態では、高速コピー可能データベース機器が、プロセッサ及びプロセッサと電子通信するメモリを含む。メモリは、バージョン識別子を含む複合キーをそれぞれ有する複数のレコードを有するデータベーステーブルを記憶する。メモリは、データベーステーブルの第１の仮想クローン及びデータベーステーブルの第２の仮想クローンを生成すること、第１の仮想クローンにおいてクエリを受信すること、及びクエリが第１の仮想クローンのバージョン識別子を含むようにクエリを修正することをプロセッサに行わせるために実行可能な命令も記憶する。プロセッサは修正済みのクエリを使用してデータベーステーブルをクエリして、第１の仮想クローンのバージョン識別子の祖先パスに関連するバージョン識別子を有する１組のレコードからの各レコードに部分的に基づく応答を生成し、その応答を送信することができる。各複合キーはバージョン識別子及びデータ部分を含む。
【図面の簡単な説明】
【０００４】
図面の簡単な説明
【図１】[0004]一実施形態による、高速コピー可能データベースを実装するためのシステムを示すブロック図である。
【図２Ａ】[0005]一実施形態による、クエリ可能階層ツリー及び関連するデータベーステーブルの図である。
【図２Ｂ】[0006]一実施形態による、競合制約が強制されたクエリ可能階層ツリー及び関連するデータベーステーブルの図である。
【図３Ａ】[0007]一実施形態による、階層ツリーの仮想クローンを生成し、それと相互作用するための方法を示す流れ図である。
【図３Ｂ】[0008]図３Ａの階層ツリーによる、データベーステーブルの時間的発展及びかかるデータベーステーブルとの相互作用を示す一連の図を含む。
【図４Ａ】[0009]一実施形態による、仮想クローンの表現を含む階層ツリーの時間的発展及び関連するデータベーステーブルを示す図を含む。
【図４Ｂ】[0009]一実施形態による、仮想クローンの表現を含む階層ツリーの時間的発展及び関連するデータベーステーブルを示す図を含む。
【図４Ｃ】[0009]一実施形態による、仮想クローンの表現を含む階層ツリーの時間的発展及び関連するデータベーステーブルを示す図を含む。
【図４Ｄ】[0009]一実施形態による、仮想クローンの表現を含む階層ツリーの時間的発展及び関連するデータベーステーブルを示す図を含む。
【図４Ｅ】[0009]一実施形態による、仮想クローンの表現を含む階層ツリーの時間的発展及び関連するデータベーステーブルを示す図を含む。
【図４Ｆ】[0009]一実施形態による、仮想クローンの表現を含む階層ツリーの時間的発展及び関連するデータベーステーブルを示す図を含む。
【図４Ｇ】[0010]一実施形態による、クエリプロセスを示す図を含む。
【図５】[0011]一実施形態による、インクリメンタルガベージコレクションプロセスを示す一連の図を含む。
【図６】[0012]一実施形態による、高速コピーデータベースのためのプロセッサによって実施されるガベージコレクション（又は連鎖削除）方法のプロセス流れ図である。
【図７】[0013]一実施形態による、高速コピーデータベースのためのプロセッサによって実施されるガベージコレクション（又は連鎖削除）方法のプロセス流れ図である。
【図８Ａ】[0014]一実施形態による、高速コピー可能データベースシステムの実装を示す図である。
【図８Ｂ】[0014]一実施形態による、高速コピー可能データベースシステムの実装を示す図である。
【図８Ｃ】[0014]一実施形態による、高速コピー可能データベースシステムの実装を示す図である。
【図８Ｄ】[0014]一実施形態による、高速コピー可能データベースシステムの実装を示す図である。
【図９】[0015]一実施形態による、高速コピー操作を示す一連の図を含む。
【発明を実施するための形態】
【０００５】
詳細な説明
[0016]  本開示の高効率データベースシステムは、非一時的プロセッサ可読メモリ内にそれぞれ記憶される（「データベーステーブル」を含む及び／又は本明細書では「データベーステーブル」と区別なく使用する）１つ又は複数の物理リレーショナルデータベースと、複数の仮想クローンであって、それによりリレーショナルデータベースのデータが所定の条件下で及び／又は既定の期間内にアクセスされ及び／又は修正され得る、複数の仮想クローンをそれぞれ含む１つ又は複数の関連する動的階層ツリーとを含む。本明細書に記載するデータベースの実装及び管理の方法は、データベースの複製及び相互作用の既知の方法よりも大幅に速く効率的である。本開示に従って実装されるとき、本明細書に記載するリレーショナルデータベースは「高速コピー可能」と呼ぶことができ、それは新たな仮想クローンをインスタンス化することによって多くの異なる「コピー」を素早く作成し及び／又は定義することができるからであり、それぞれの異なるコピーは「仮想」コピー（関連する異なる仮想クローンの観点から認識され、かかる仮想クローンからアクセス可能なコンテンツ）を指す。別の言い方をすれば、リレーショナルデータベースを高速コピー可能データベースに変換するクラスでリレーショナルデータベースが「包まれる」と言うことができる。
【０００６】
[0017]  一部の実装形態では、リレーショナルデータベースの集中型の「マスタ」又は「リーダ」コピーはないが、任意選択的にそれぞれが異なる関連する管理者を有する複数の関連する地理的に分散した位置に、関連する動的階層ツリーを有する複数の物理リレーショナルデータベース（即ちリレーショナルデータベースの「インスタンス」）がある点で、本開示の高効率データベースシステムは「リーダレス」だと言うことができる。換言すれば、複数の物理リレーショナルデータベースのそれぞれにおいて異なる変更を異なる順序で及び／又は異なる時点において適用することができる。分散データベースシステム内にリーダを有さないことは分散データベースシステムのセキュリティを高めることができる。例えばリーダがあると、単一攻撃点及び／又は単一障害点がある。悪意あるソフトウェアがリーダに侵入する及び／又はリーダのデータベーステーブル内の値が正しくない値を有するように悪意を持って変更される場合、その侵入及び／又は正しくない値がデータベースインスタンスのネットワークの全体にわたって伝搬し、又は別の分散データベースインスタンスに転送される可能性がある。対照的に、本開示のリーダレスシステムでは単一攻撃点及び／又は単一障害点がない。本明細書に記載するリーダレス分散データベースシステムは、装置間のデータ伝送量を減らしながら１つ又は複数の合意アルゴリズムの収束速度を高めることもできる。本明細書に記載する分散データベースシステムは、データベーステーブルのコンテンツに対する異なる増分変化を追跡するために使用可能な仮想クローンを生成することにより「高速コピー可能」でもある。本明細書で使用するとき、「高速コピー」は「仮想クローン」の語句と同じ意味を有する。そのため、一部の知られている分散データベースと異なり、とりわけ管理されているデータのコーパスが大きい場合に資源集約的であり且つ時間がかかる可能性がある複製及び複写を使用することなしに更新を達成することができる。
【０００７】
[0018]  一部の実施形態では、階層ツリーの１組の仮想クローンからの各仮想クローンは、その仮想クローンと相互作用するユーザによって（例えばクエリによって）リレーショナルデータベースのデータがアクセスされ得る点で「仮想データベース」の役割を果たすことができ、そのためその仮想クローンは、実際にはそうでなくてもデータがその仮想クローンにおいて記憶され及び／又は局所的に探索されているようにユーザには見える（即ち記憶及びクエリがリレーショナルデータベース／テーブル上で行われる）。リレーショナルデータベースのデータテーブルに対する修正は１組の仮想クローンからの複数の仮想クローンにおいて適用することができ、「複合キー」を使用して（例えばデータベーステーブルに追加される属性及びデータベーステーブルのレガシキーフィールドを使用して）リレーショナルデータベース内のその仮想クローンに関連付けることができる。複合キーは少なくとも２つの値、つまり少なくとも１つの仮想クローンに関連するバージョン識別子（「バージョンＩＤ」）と、そのデータベーステーブルのレガシキーフィールド（本明細書では「仮想主キーフィールド」とも呼ぶ）等、参照されているデータベーステーブルの特性（例えば行（即ち「レコード」又は「タプル」）の識別子又は名前、列（即ち「属性」）の識別子又は名前、データラベル、データ値等）を指すフィールドとを含むことができる。属性の例は、これだけに限定されないが仮想主キーの名前、値（例えば収支、借方、貸方、送金額）、通貨、説明、日にち、量、タリー、バージョン、継続期間、順序等を含む。複合キーの部分はデータベーステーブルのレコードの一部として記憶することができ、そのため或る仮想クローンによって加えられる編集が他の任意の仮想クローンの観点からデータベーステーブルのデータに影響を及ぼさない。一部の実施形態では、所与の複合キーの複数のインスタンスが任意の所与の時点においてデータベーステーブル内で共存することが認められない（即ちデータベーステーブル内には所与の複合キーの１つのインスタンスしかあり得ない）。特定の仮想クローンによって行われるリレーショナルデータベースのデータテーブルに対する修正は、その仮想クローンのバージョン識別子によってその仮想クローンに関連付けられ、そのためその仮想クローンによって行われるその後のクエリ又は修正は、その仮想クローン／バージョンＩＤによってデータベーステーブルに行われた累積的相互作用によって定められるリレーショナルデータベースの直近の形式に適用され得る。しかし、特定の仮想クローンによって行われるデータベーステーブルへの修正は、他の仮想クローンの観点からは認められず又はアクセスすることができない。変更に関連する修正側の仮想クローンにとっての変更の帰属が仮想クローンの関連するバージョンＩＤに基づきながらこの分散方式で変更を実施することは、（例えば仮想クローンをホストする１組のサーバノードのそれぞれにおいて）各リレーショナルデータベースのデータの複数のコピーを複製し、分散させ、局所的に記憶する必要性をなくす。本明細書に記載する方法は、多くのマシンとネットワーク通信する各マシンによって行われる各変更に応答し���多くのマシンにリレーショナルデータベースの全コンテンツを複数回伝送する必要性を除去することができる。
【０００８】
高速コピー可能データベースシステム
[0019]  図１は、一部の実施形態による、高速コピー可能データベースシステム１００の構成要素を示すシステム図である。図１に示すように、システム１００は、ネットワーク１０５と無線通信又は有線通信する第１の計算装置１１０と、同じくネットワーク１０５と無線通信又は有線通信する１つ又は複数の追加の計算装置１２０とを含む。第１の計算装置１１０は、オンボードメモリ１１２と動作可能に通信するプロセッサ１１１及びディスプレイ１１３を含む。メモリ１１２は、１つ又は複数のデータベーステーブル１１４（即ちリレーショナルデータベースのインスタンス）、高速コピア１１５、及び（例えば合意アルゴリズムをプロセッサに実施させる）合意命令１１６を記憶する。各データベーステーブル１１４は、以下でより詳細に説明する１つ又は複数の複合キー１１４Ａを含む。１つ又は複数の更なる計算装置１２０からの各計算装置は、オンボードメモリ１２２と動作可能に通信するプロセッサ１２１及び任意選択的に１つ又は複数のインタフェース（例えばディスプレイ、グラフィカルユーザインタフェース（ＧＵＩ）、無線トランシーバ等）（不図示）を含む。メモリ１２２は、１つ又は複数のデータベーステーブル１２４（即ちリレーショナルデータベースのインスタンス）、高速コピア１２５、及び（例えば合意アルゴリズムをプロセッサに実施させる）合意命令１２６を含む。
【０００９】
[0020]  プロセッサ１１１及び１２１のそれぞれは、汎用プロセッサ、中央処理装置（ＣＰＵ）、マイクロプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、コントローラ、マイクロコントローラ、状態機械等のうちの１つ又は複数を含み得る。一部の状況下では、本明細書で使用するとき「プロセッサ」は特定用途向け集積回路（ＡＳＩＣ）、プログラマブル論理デバイス（ＰＬＤ）、書換可能ゲートアレイ（ＦＰＧＡ）等を指す場合がある。「プロセッサ」という用語は処理装置の組み合わせ、例えばＤＳＰとマイクロプロセッサとの組み合わせ、複数のマイクロプロセッサの組み合わせ、ＤＳＰコアに関連する１つ又は複数のマイクロプロセッサの組み合わせ、又はそのような他の任意の構成を指し得る。
【００１０】
[0021]  メモリ１１２及び１２２のそれぞれは、データ及びコード（例えば命令）等の電子情報を記憶することができる任意の電子部品を含み得る。メモリという用語は、ランダムアクセスメモリ（ＲＡＭ）、読取専用メモリ（ＲＯＭ）、不揮発性ランダムアクセスメモリ（ＮＶＲＡＭ）、プログラマブル読取専用メモリ（ＰＲＯＭ）、消去プログラム可能読取専用メモリ（ＥＰＲＯＭ）、電気的消去可能ＰＲＯＭ（ＥＥＰＲＯＭ）、フラッシュメモリ、磁気又は光データ記憶域、レジスタ等の様々な種類の非一時的プロセッサ可読媒体を指し得る。プロセッサがメモリから情報を読み取ることができる及び／又はメモリに情報を書き込むことができる場合、メモリはプロセッサと動作可能に通信する又は電子通信すると言われる。プロセッサに欠かせないメモリはプロセッサと電子通信する。非一時的コンピュータ可読媒体の例は、これだけに限定されないがハードディスク、フロッピディスク、及び磁気テープ等の磁気記憶媒体、コンパクトディスク／デジタルビデオディスク（ＣＤ／ＤＶＤ）、コンパクトディスク読取専用メモリ（ＣＤ−ＲＯＭ）、及びホログラフィック装置等の光記憶媒体、光ディスク等の光磁気記憶媒体、搬送波信号プロセッサ、並びに特定用途向け集積回路（ＡＳＩＣ）、プログラマブル論理デバイス（ＰＬＤ）、読取専用メモリ（ＲＯＭ）、及びランダムアクセスメモリ（ＲＡＭ）装置等、プログラムコードを記憶し実行するように特に構成されるハードウェア装置を含む。本明細書に記載する他の実施形態は、例えば本明細書で論じる命令及び／又はコンピュータコードを含み得るコンピュータプログラム製品に関する。
【００１１】
[0022]  本開示の高速コピー可能データベースシステムは、一部の実施形態では、図１に関して以下で示し説明するようにハードウェアとして又はソフトウェア、例えば高速コピアとして、又は非一時的メモリ内に記憶されメモリと動作可能に通信するプロセッサによって実行可能な命令を含む他のソフトウェア形式として実装することができる。メモリ（及び／又はプロセッサ）は、リレーショナルデータベースを記憶する（にアクセスする）こともできる。高速コピアは、関連するリレーショナルデータベースを「包み込む」「ラッパークラス」（「ラッパーパターン」又は「ラッパー関数」とも呼ばれる）であり得る。例えばソフトウェアが実行されており、構造化照会言語（ＳＱＬ）クエリがプロセッサにおいて受信される場合、そのプロセッサはリレーショナルデータベースにクエリを送信する前にクエリを修正することができるラッパークラス内のメソッドを呼び出すことにより、リレーショナルデータベースにＳＱＬクエリを送信する／伝えることができる。次いで、ＳＱＬクエリに応答してリレーショナルデータベースによって返される結果がラッパークラス内のメソッドによって返され得る／送信され得る。高速コピーソフトウェアは、リレーショナルデータベースへの呼び出しをインタセプトすること、リレーショナルデータベースからの呼び出しをインタセプトすること、リレーショナルデータベースにフィールド（例えば以下で論じる「バージョン」）を追加すること、リレーショナルデータベースのフィールドを修正すること、リレーショナルデータベースのフィールドを削除すること、リレーショナルデータベースの構造を修正すること（例えばレコード／行又は属性／列を追加し又は除去すること）、又は図２〜図７に関して図示し以下で説明する任意の機能のうちの１つ又は複数を任意の組み合わせで行うように構成され得る。
【００１２】
[0023]  一部の実施形態では、高速コピー可能データベースシステムが、リレーショナルデータベースのインスタンス及び高速コピーソフトウェアをホストする非一時的メモリに動作可能に結合されるプロセッサをそれぞれ含む、単一のマシン（又は「ノード」）又は複数のマシン若しくは「ノード」を含む。最初（即ち如何なる変更も適用される前）、リレーショナルデータベースの各インスタンスは同じである。ノードは、互いに地理的に隔てられてもよく及び／又は異なる管理者の個人及び／又はエンティティに関連することができる。各ノードは、１つ又は複数の仮想クローン（本明細書では「オブジェクト」又は「仮想オブジェクト」とも呼ぶ）であって、それによりリレーショナルデータベースを修正し及び／又はクエリすることができる、１つ又は複数の仮想クローンを含む関連する階層ツリー及び／又は階層ツリー（又は階層ツリーの表現）の後続の部分を生成し及び／又は記憶することができる。基礎を成す階層ツリーが拡大され及び／又は修正されるとき、階層ツリーの生成は複数回行うことができる。例えば各ノードは少なくとも２つの仮想クローン、つまり第１の仮想クローン及び第２の仮想クローンを生成することができる。第１の仮想クローンはリレーショナルデータベースのフィールドに対して、例えばアクティビティデータが（例えば別のノードから）そのノードにおいて受信されるとき変更を適用するために使用され得る。これらの変更は、例えばアクティビティデータを受信することに応答して及び／又はアクティビティデータに基づいて自動で及び／又は管理者によって適用され得る。アクティビティデータは、受信ノードがパーティであるノードのネットワーク内で生じている又は生じたとされている１つ又は複数のイベント又はトランザクションに関係するデータを含み得る。第１の仮想クローンによって適用される変更は、１つ又は複数のトランザクション又はイベントに関連する受信されたままのアクティビティデータの「ランニングタリー」を集合的に表すものだと見なすことができる。
【００１３】
[0024]  一部の実装形態では、ノードの１つ又は複数によって開始される及び／又は（例えばノードのネットワーク内で検出される変更によって及び／又は既定の時間的スケジュールに従ってトリガされる）高速コピーソフトウェアによって自動で実施される「同期」イベントの結果としてアクティビティデータが所与のノードにおいて受信される。同期中、ノードのネットワークからの少なくとも２つのノードが自らの関連するデータベーステーブルからのデータをやり取りする。データは、例えばアクティビティデータ又はその一部とすることができる。少なくとも２つのノード間で／のうちでやり取りされるデータは、ノードネットワーク内の集約アクティビティの部分集合又は部分ビューを表すことができる。かかる一部の例では、第１の仮想クローンによってノードのデータベーステーブルに適用される変更は、その合意順序及び／又は有効性が到達されておらず、及び／又は介在する変更がデータベーステーブルから欠けているかどうかの判定がまだ行われていない（即ちそれらの変更について合意にまだ達していない／合意がまだ満たされていない）「仮の変更」である。第１の仮想クローンによってノードにおいて修正されるデータベーステーブル内のレコードは、第１の仮想クローンに関連する第１のバージョンＩＤを含む複合キーを含み得る。
【００１４】
[0025]  一部の実装形態では、同期プロセスが（１）同期中に受信される１つ又は複数のイベント（例えば１つ又は複数のトランザクションを含む）又はトランザクションに基づき、（例えばノードによって定められるデータベース状態変数によって捕捉される）データベーステーブルの「現在の状態」を繰り返し更新すること、及び（２）イベント又はトランザクションの順序付けに関する新たな情報を受信するたびに、例えば前の状態のコピーに戻り、イベント又はトランザクションを新たな順序で処理することによって現在の状態を再計算することにより、その現在の状態を繰り返し再構築すること（例えばイベントの順序を再構成すること）を含む。従って、例えば各計算装置は状態の２つのバージョン、つまり新たなイベント及びトランザクションが受信されるとき更新される（例えば上記で論じた第１の仮想クローンによって実施される）状態と、合意に達した後でのみ更新される（例えば上記で論じた第２の仮想クローンによって実施される）状態とを維持することができる。何らかの時点において（例えば所定の期間の後、所定のイベント数が定められ及び／又は受信された後等）、新たなイベント及びトランザクションが受信されるとき更新される状態のバージョンを階層ツリーから破棄し又は削除することができ、新たなイベント及びトランザクションが受信されるとき更新される状態の新たなバージョンとして、合意に達した後で更新される状態の新たなコピーを生成することができる（例えば上記で論じた第３の仮想クローンによって実施される）。上記の手法は両方の状態の同期を確実にすることができる。一部の例では、状態（状態の様々なコピーを含む）は、例えば「高速コピー可能」arrayList（本明細書では高速クローンarrayList、高速クローンアレイ、又は高速コピー可能アレイとも呼ぶ）、「高速コピー可能」ハッシュテーブル、高速コピー可能」リレーショナルデータベース、又は「高速コピー可能」ファイルシステム（本明細書では高速クローンファイルシステム及び／又は高速コピー可能ファイルシステムとも呼ぶ）等の任意の適切なデータ構造内に、任意選択的に高速コピー可能ファイルシステム内のファイルのＮバイト（例えば４０９６バイト又は１０２４バイト）部分ごとに別個のファイルがホストオペレーティングシステム上で作成され及び／又は定められた状態で記憶され得る。
【００１５】
[0026]  本明細書で使用するとき、「合意」は、合意アルゴリズムによって検討されている１つ又は複数の変更が正しく順序付けられており、重複ではなく、介在する如何なる変更も欠かしておらず、及び／又は正当だと（即ち悪意がない又は不正ではないと）合意アルゴリズムを使用して到達される判定を指す。合意は、例えば変更が正しく順序付けられており、重複ではなく、介在する如何なる変更も欠かしておらず、及び／又は有効だと全ての又は少なくとも既定の閾値数のノードが合意するとき又は少なくとも既定の閾値確実性レベルで結論付けたときに達したと言うことができる。例えば合意に達している一連の変更は、一連のイベント及び／又はトランザクションの「真の」又は正確な表現を反映していると言うことができる。一部の実装形態では、合意アルゴリズムの所定の反復回数後に及び／又は既定のスケジュールに従って合意が所定の時間枠の中の「ラウンド」で到達される。
【００１６】
[0027]  第１の仮想クローンによって適用される変更又は１組の変更について合意に達した後、その変更又は１組の変更を第２の仮想クローンによってデータベーステーブルに適用することができ、データベーステーブルの影響を受ける各レコードは第２の仮想クローンに関連する第２のバージョンＩＤを含む複合キーを呼応して含むことができる。この変更又は１組の変更が第２の仮想クローンによって及び任意選択的に自動で適用可能になった後、及び／又はそれらの変更が適用されることに応答して第１の仮想クローンを削除することができ、第２の仮想クローンの子孫である少なくとも２つの更なる仮想クローン（例えば第３の仮想クローン及び第４の仮想クローン）を生成することができる。次いで上記で説明したのと同様のやり方で、第３の仮想クローンによってデータベーステーブルに対する仮の変更が行われ、第４の仮想クローンによってデータベーステーブルに対する合意後の変更が行われながら、高速コピープロセスが続行され得る。
【００１７】
[0028]  一部の実装形態では、合意アルゴリズム又はメソッドがプラットフォーム（即ち図１の計算装置１１０のメモリ１１２内に記憶され、プロセッサ１１１によって実行される合意命令１１６等、計算装置及び／又はシステムのプロセッサ上で実行されるソフトウェアプログラム）によって実装され得る。プラットフォームはトランザクションを収集し、広め、順序付け、合意プロセスに関連する他の適切なタスクを実行することができる。
【００１８】
[0029]  一部の実装形態では、仮想クローン及び／又はその関連するノードから依存する（即ち仮想クローン及び／又はその関連するノードから直接伸び、階層ツリー内で下降する）１つ又は複数の子孫ノードが生成されると、たとえ階層ツリーから１つ又は複数の子孫ノードを削除し又は除去した場合及びその後でさえ、仮想クローン及び／又はその関連するノードによってクエリをもはや行うことはできない。
【００１９】
[0030]  一部の実装形態では、本開示の１つ又は複数のデータベーステーブルを１つ又は複数の仮想クローンによってクエリすることができる。図２Ａ及び図２Ｂは、一実施形態によるクエリ可能階層ツリー（本明細書では「バージョンツリー」とも呼ぶ）の図を示す。一部の実装形態では、階層ツリー（本明細書では「バージョンツリー」とも呼ぶ）及び／又は階層ツリーの表現が非一時的メモリ内に保たれ及び／又は記憶される。図２Ａ及び図２Ｂに示すように、クエリ可能階層ツリーは、リレーショナルデータベースインスタンス２３０とその複数の仮想クローンＶ１、Ｖ２、Ｖ３、及びＶ４とを含む。仮想クローンＶ１、Ｖ２、及びＶ３の直列提示は仮想クローンＶ１が最初に生成され（及び任意選択的にＶ１によってデータベース２３０に変更が加えられ）、仮想クローンＶ２（Ｖ１の「子孫」仮想クローン）が２番目に生成され（及び任意選択的にＶ２によってデータベース２３０に変更が加えられ）、仮想クローンＶ３（Ｖ２の「子孫」仮想クローン）が３番目に生成された（及び任意選択的にＶ３によってデータベース２３０に変更が加えられた）ことを示す。Ｖ３にはＶ３から伸びる／依存する子ノードがない点で、Ｖ３は「葉ノード」である。一部の実装形態では、子孫仮想クローンが生成されると、直系の祖先仮想クローンによってデータベース２３０への変更はもはや行うことができないことに留意されたい。換言すれば、仮想クローンＶ３が生成されると、仮想クローンＶ２又は仮想クローンＶ１によってデータベース２３０への変更はもはや適用することができない。
【００２０】
[0031]  （図２Ａに示す）一実施形態では、Ｖ３において受信されるクエリを次のように逐次的に実施／実行することができる。データベース２３０はレコードであって、（同じくデータベース２３０内にある）そのレコードの祖先バージョンと同じ仮想主キーを有する、レコードを含むと仮定されたい。例えば図２Ａのデータベーステーブルは属性レコードＩＤ（ＲＩＤ）（仮想主キー）、名前、ランク、及びバージョンを含み、（１）複合キー(1001,V3)を有するデータベース２３０内のレコード、（２）複合キー(1001,V2)を有するデータベース２３０内のレコード、及び（３）複合キー(1001,V1)を有するデータベース２３０内のレコードがある。かかる実装形態では、バージョンツリーが図２Ａに示す通りであり（Ｖ３はＶ２の子孫仮想クローンであり、Ｖ２はＶ１の子孫仮想クローンであり）、仮想主キーＲＩＤ＝１００１について仮想クローンＶ３によってクエリが受信される場合、プロセッサは(1001,V3)の複合キーを有するレコードをまず探す。（図２Ａの例ではそうであるように）かかる複合キーを有するレコードが見つかった場合、そのレコードが返されクエリが終了する。しかし、複合キー(1001,V3)を有するレコードがデータベース２３０内で見つからなかった場合、次にプロセッサはバージョンツリーに基づいて複合キー(1001,V2)を求めてデータベース２３０をクエリする。かかる複合キーを有するレコードがデータベース２３０内で見つかった場合、そのレコードが返されクエリが終了する。さもなければ、プロセッサは複合キー(1001,V1)を求めてデータベース２３０をクエリする。このようにして、クエリはバージョンツリー内の高位番号のバージョンを最初に参照し、結果が返されない場合はバージョンツリーを段階的に／逐次的に上がって行くことによって行うことができる。上記のクエリプロセスは、競合制約が強制されないクエリプロセスとして説明することができる。換言すれば、階層ツリーの同じ祖先系統／分岐内で同じ仮想主キー及びバージョンＩＤを有する複合キーを有するレコードがデータベース２３０内で共存することができる。
【００２１】
[0032]  図２Ａに示す階層ツリーを所与とし、代わりに仮想主キー１００１について仮想クローンＶ４（Ｖ１の子孫仮想クローン）によってクエリが受信される場合、プロセッサは(1001,V4)の複合キーを有するレコードをまず探す。（図２Ａの例ではそうであるように）かかる複合キーを有するレコードが見つかった場合、そのレコードが返されクエリが終了する。しかし、複合キー(1001,V4)を有するレコードがデータベース２３０内で見つからなかった場合、次にプロセッサはバージョンツリーに基づいて複合キー(1001,V1)を求めてデータベース２３０をクエリし、それはＶ１がＶ４の祖先仮想クローンだからである。かかる複合キーを有するレコードがデータベース２３０内で見つかった場合、そのレコードが返されクエリが終了する。さもなければ、プロセッサは「ヌル」又は「該当結果なし」の応答を返す。
【００２２】
[0033]  上記の説明は仮想主キーに関するクエリに言及したが、クエリは多岐にわたる他のやり方で構成することができる。例えばクエリは、指定の属性の値を有する全てのレコード（例えば「名前」の属性について「Smith」の値を有する全てのレコード）、２つ以上の指定の属性について値が一致する全てのレコード（例えば「Smith」の「名前」及び「４」のランクの属性の値を有する全てのレコード）、指定の主仮想キー及び指定の属性の値を有する全てのレコード（例えば「１００１」の主仮想キー及び「名前」の属性について「Smith」の値を有する全てのレコード）等を要求することができる。一部の実装形態では、クエリが仮想主キーへの参照を含まない。
【００２３】
[0034]  （図２Ｂに示す）別の実施形態では、競合制約を強制した状態でＶ３において受信されるクエリを実施／実行することができる。競合制約は、仮想クローン「Ｘ」に関する仮想主キー及びバージョンＩＤを含む所与の複合キーについて、Ｘの祖先に関連する同じ仮想主キー及びバージョンＩＤを有する他の複合キーがデータベース２３０内にないと規定する規則及び／又は命じるデータベースアーキテクチャを含み得る。別の言い方をすれば、競合制約が適用され／強制され／守られる場合、任意の所与の仮想主キーについて、その仮想主キー及び階層ツリーの所与の「分岐」上の任意の仮想クローンに関連するバージョンＩＤを有する複合キーを１つしか所与の時点においてデータベーステーブル内に記憶することができない。従って、その仮想主キー及び階層ツリーの祖先パス沿いの仮想クローンに関連するバージョンＩＤをそれぞれ参照する複数の複合キーがあることはあり得ない。例として、競合制約を強制した状態でクエリを次のように実施／実行することができる。バージョンツリー及びデータベース２３０が図２Ｂに示す通りだと仮定する。仮想主キーＲＩＤ＝１００１について仮想クローンＶ３によってクエリが受信される場合、プロセッサはＲＩＤ＝１００１及び（バージョン＝３、又はバージョン＝２、又はバージョン＝１）を有するレコードを探し、見つける。Ｖ３によって最初に受信されるクエリはバージョンＩＤの参照を含まなくてもよく、又はバージョンＩＤ  Ｖ３だけを参照してもよいことに留意されたい。（例えば高速コピーソフトウェアを実行する）プロセッサは、バージョンＩＤ  Ｖ３、Ｖ２、及びＶ１のそれぞれが含まれるようにクエリを修正することができる。データベースが競合制約を満たす場合、結果として生じる１組のレコードは同じ仮想主キーを有する２つのエントリを含まず、その理由はそれらの結果がバージョンツリー内の単一パスから来るバージョンを有するレコードを有し、そのため２つのレコードが同じ仮想主キーを有する場合はそれらのキーが競合制約に違反するからであることに留意されたい。結果テーブルを生成することができ、検索の結果として結果テーブルを返す前に結果テーブルからバージョン属性（列）を（例えばプロセッサによって）削除することができる。
【００２４】
[0035]  図２Ｂに示す階層ツリーを所与とし、代わりに仮想主キー１００１について仮想クローンＶ４によってクエリが受信される場合、（例えば高速コピアを実行する）プロセッサは、バージョンＩＤ  Ｖ４及びＶ１のそれぞれが含まれるようにクエリを修正することができる。次いでプロセッサはＲＩＤ＝１００１及び（バージョン＝Ｖ４又はバージョン＝Ｖ１）を有するレコードを探し、見つける。プロセッサが修正済みのクエリと一致するレコードを一切見つけない場合、プロセッサは「ヌル」又は「該当結果なし」の応答を返す。
【００２５】
[0036]  上記で述べたように、図２Ｂの上記の説明は仮想主キーに関するクエリを参照するが、クエリは多岐にわたる他のやり方で構成することができる。例えばクエリは、指定の属性の値を有する全てのレコード（例えば「名前」の属性について「Smith」の値を有する全てのレコード）、２つ以上の指定の属性について値が一致する全てのレコード（例えば「Smith」の「名前」及び「４」のランクの属性の値を有する全てのレコード）、指定の主仮想キー及び指定の属性の値を有する全てのレコード（例えば「１００１」の主仮想キー及び「名前」の属性について「Smith」の値を有する全てのレコード）等を要求することができる。一部の実装形態では、クエリが仮想主キーへの参照を含まない。
【００２６】
[0037]  図３Ａは、階層ツリーの仮想クローンを生成し、それと相互作用するための方法を示す流れ図である。図３Ｂは、図３Ａの方法による階層ツリーの時間的発展及び階層ツリーによるデータベーステーブルとの相互作用を示す一連の図を含む。理解を助けるために、図３Ａ及び図３Ｂを一緒に読んで理解することができる。図３Ｂに示すように、図３Ａの方法２００を開始する前に、１つ又は複数のデータベーステーブルを含むデータベース２３０が存在する。図３Ａでは、２０２で、方法２００は第１の仮想クローンを生成することを含む。それに応じて及び同時に（ｂ）で、データベース２３０の少なくとも１つのデータベーステーブルの第１の仮想クローンが定められ、これにより２２２で「Ｖ１」として表す階層ツリーが開始される。その後２０４で、方法２００は第２の仮想クローンを生成することを含み、それに応じて及び同時に（ｃ）で、第２の仮想クローン「Ｖ２」（２２４）が階層ツリーに追加される。図３ＢではＶ１から生じる及び／又は発生する（従ってＶ１の「子」又は「子孫」仮想クローンであり、Ｖ１をＶ２の「祖先」又は「先行」仮想クローンにする）ように示すが、他の例ではＶ２が先行仮想クローンを有さないように、Ｖ２がデータベース２３０から直接生じる及び／又は発生することができる（その場合Ｖ１及びＶ２は階層ツリー内の兄弟仮想クローンと呼ばれる）。方法２００を続け、２０６で、図３Ｂの（ｄ）に示すようにＶ２によってクエリが受信される。クエリQ(X)はＶ２によって受信され、レコードＩＤ「Ｘ」を参照する。クエリを受信することに応答し、高速コピーソフトウェア（例えば図１の高速コピア１１５）を実行するプロセッサが図３Ａの２０８でクエリを修正して、レコードＩＤ「Ｘ」並びにバージョン又は複数のバージョン（図３Ｂの（ｅ）に示すようにこの事例ではＶ１又はＶ２）を参照する修正済みのクエリQ(X, V1 又は V2)を生成する。修正済みのクエリは、要求されたレコードＩＤ「Ｘ」と一致し、且つＶ１又はＶ２（どちらの仮想クローンもデータベース２３０から生じる直接の祖先系統内にあるので）に関連するバージョン識別子を有するデータベーステーブルレコードについてリレーショナルデータベースが検索されることを引き起こす。２１０で、図３Ｂの（ｆ）に示すように修正済みのQ(X, V1 又は V2)クエリが実行され、２１２で、図３Ｂの（ｇ）に示すようにクエリの結果（応答）R(X,V1)又はR(X,V2)がＶ２によって返され送信される。（ｇ）に示すように、レコードＩＤ  Ｘ及びＶ１に関連する応答又はレコードＩＤ  Ｘ及びＶ２に関連する応答が返される。レコードＩＤ  Ｘに対する修正が仮想クローンＶ２によってまだ行われていない場合はレコードＩＤ  Ｘ及びＶ２を参照するレコードはなく、レコードＩＤ  Ｘに関連するレコードの最新形式はＶ１に関連するバージョンＩＤを有する。
【００２７】
[0038]  図４Ａ〜図４Ｆは、競合制約が適用された状態の階層ツリーの時間的発展（ステップ（ａ）から（ｔ））を示す、仮想クローンの表現及び関連するデータベーステーブルを含む。図４Ａの始まり（３００）で、データベーステーブル２３０ａは属性「ＦＩＤ」（基礎を成すデータベーステーブルに対するレコードＩＤ及び／又はキーの役割を果たす「フルーツＩＤ」）、「アイテム」、「フルーツ」、及び「バージョン」、並びに単一の投入レコード（ＦＩＤ＝１００１、アイテム＝パイ、フルーツ＝リンゴ、及びバージョン＝Ｖ１）を含む。更に３００で、（（ａ）に示す階層ツリーによって表されているように）仮想クローンＶ１及びＶ２（Ｖ１の直接の子孫）が既に存在している。その後３０２で、データベーステーブル２３０ａへの変更がまだ行われていない状態で、新たな仮想クローンＶ３（２２６）がインスタンス化され階層ツリーに追加される。その後３０４で、フルーツの値が「洋梨」であるようにパイのレコードを変更するための要求がＶ３によって受信される。この要求を受信することに応答し、３０６で、バージョンＶ３を有する新たなレコードがデータベーステーブル２３０ａに追加される。図４Ａに示すように、ＦＩＤ１００１に関連する第２のレコードはアイテム属性で「パイ」の値を保持し、フルーツ属性で「リンゴ」の代わりに「洋梨」を含み、（それにより変更が要求された仮想クローン）Ｖ３の関連するバージョン識別子を有する。加えて、競合制約が守られているので、競合制約が満たされていることを確実にするために、データベーステーブル２３０ａ内の第１のレコード内のバージョン属性の値が（３０６に示すように）Ｖ１からＶ２に変更される。競合制約が強制されていない場合、かかる変更を第１のレコードに行う必要がないことに留意されたい。複合キーがＦＩＤ及びバージョン属性の両方を含むので、（図４Ａの３０６に示すように）複数のレコードが同じＦＩＤ（又は「仮想主キー」）を有し得ることに留意されたい。換言すれば、３０６における第１のレコードはＦＩＤ＝１００１及びバージョン＝Ｖ２の複合キーを有し、３０６における第２のレコードはＦＩＤ＝１００１及びバージョン＝Ｖ３の複合キーを有し、そのため複合キーは依然として一意であり互いに区別可能である。
【００２８】
[0039]  図４Ｂへと続き、及び３０６でのデータベーステーブル２３０ａの修正の後、３０８で、「パイ」の値を参照するクエリQ(Pie)がＶ３によって受信される。３１０で、「パイ」及び「Ｖ３又はＶ１」の値の両方を参照するようにクエリがQ(Pie,V3 又は V1)へと修正され、これは上記の解説と同様に仮想クローンＶ３及びＶ１がデータベース２３０から生じる及び／又は発生する共通の祖先系統を共有するからである。次いで、修正済みのクエリがデータベーステーブル２３０ａに対して実行される。「パイ」及び「Ｖ３又はＶ１」の両方と一致するデータベーステーブル２３０内の唯一のレコードはＦＩＤ１００１及びバージョンＶ３を有するレコードなので、（３１２に示すように）クエリはそのレコードを返す。従って、クエリはＶ３から発生したのでＶ１及びＶ３に関連するレコードが検索されるが、Ｖ３と同じ祖先系統内にないＶ２に関連するレコードは検索されない。
【００２９】
[0040]  図４Ｂの３１０において競合制約を守らない実装形態では、クエリが修正されないことに留意されたい。代わりに、プロセッサは「パイ」及び「Ｖ３」の値と一致するレコードを最初に検索する。（図４Ｂの３１０の例ではそうであるように）かかるレコードが見つかった場合、そのレコード（ＦＩＤ＝１００１、アイテム＝パイ、フルーツ＝洋梨）が返されクエリが終了する。しかし、「パイ」及び「Ｖ３」の値と一致するレコードがデータベース２３０内で見つからなかった場合、次にプロセッサはバージョンツリーに基づいて「パイ」及び「Ｖ１」の値と一致するレコードを求めてデータベース２３０をクエリする（即ちバージョンツリーを上がって行く）。かかる複合キーを有するレコードがデータベース２３０内で見つかった場合、そのレコードが返されクエリが終了する。さもなければ、プロセッサは「ヌル」又は「該当応答なし」の応答を返す。
【００３０】
[0041]  図４Ｃへと続き、３１４で、「パイ」の属性値を参照する更なるクエリQ(Pie)がＶ２によって受信される。ここでも「パイ」及び「Ｖ２又はＶ１」の値の両方を参照するようにクエリがQ(Pie,V2 又は V1)へと修正され、これは仮想クローンＶ２及びＶ１がデータベース２３０から生じる及び／又は発生する共通の祖先系統を共有するからである。次いで３１６で、修正済みのクエリがデータベーステーブル２３０ａに対して実行される。「パイ」及び「Ｖ２又はＶ１」の両方と一致するデータベーステーブル２３０ａ内の唯一のレコードはＦＩＤ１００１及びバージョンＶ２を有するレコードなので、（３１８に示すように）クエリはそのレコードを返す。クエリはＶ２から発生したのでＶ１及びＶ２に関連するレコードが検索されるが、Ｖ２と同じ祖先系統内にないＶ３に関連するレコードは検索されない。従ってＶ２及びＶ３は、同じレコード１００１の異なるバージョンをデータベーステーブル２３０ａ内にどちらも有することができる。
【００３１】
[0042]  図４Ｄへと続き、３２０で、更なるクエリQ(Pear)がやはりＶ２によってだが、今回は「洋梨」の属性値を参照して受信される。ここでも「洋梨」及び「Ｖ２又はＶ１」の値の両方を参照するようにクエリがQ(Pear,V2 又は V1)へと修正され、これは仮想クローンＶ２及びＶ１がデータベース２３０から生じる共通の祖先系統を共有するからである。次いで３２２で、修正済みのクエリがデータベーステーブル２３０ａに対して実行される。「洋梨」及び「Ｖ２又はＶ１」の両方と一致するレコードはデータベーステーブル２３０ａ内にないので、３２４で結果は返されない（例えばクエリと一致するレコードが見つからないという信号及び／又は通知が返される）。換言すれば、Ｖ３によって行われたデータベーステーブルのデータへの修正はＶ２によってアクセス不能であり、Ｖ２のクエリ可能データに影響を及ぼさない。
【００３２】
[0043]  図４Ｅの３２６へと続き、フルーツ属性のリンゴ及びアイテム属性のパイを有するレコードをデータベーステーブル２３０ａから削除し、フルーツ属性のバナナ及びアイテム属性のパンを有するレコードを追加するための要求が３２６でＶ２によって受信される。３２８で、及び３２６でＶ２によって受信された要求に応答し、「リンゴ」及び「パイ」の属性値を参照するレコードを識別し、次の操作のうちの１つ又は複数が行われ、その操作とはつまり「リンゴ」及び「パイ」の属性値を参照するレコードをデータベーステーブル２３０ａから削除し、そのバージョンＩＤを除去する（その後Ｖ２によってアクセス可能でなくなることを確実にする）こと、又は「削除済み」フラグを表す属性をデータベーステーブル２３０ａに追加し、そのレコードについて「真」に設定することである。更に３２８で、１００２のＦＩＤ、「パン」のアイテム属性値、「バナナ」のフルーツ属性値、及びＶ２のバージョンＩＤを有する新たなレコードがデータベーステーブル２３０ａに追加される。その後３３０で、パンの値を有するアイテム属性を有するレコードを探すクエリQ(Bread)がＶ３によって受信される。上記の解説と同様に、パンのアイテム属性値及びバージョンＩＤ「Ｖ３又はＶ１」の両方を参照するようにクエリがQ(Bread,V3 又は V1)へと最初に修正される。「パン」及び「Ｖ３又はＶ１」の両方と一致するレコードはデータベーステーブル２３０ａ内にないので、３３２で結果は返されない（例えばクエリと一致するレコードが見つからないという信号及び／又は通知が返される）。
【００３３】
[0044]  図４Ｅで示すように、一部の実装形態では、データベーステーブル２３０ａからレコードを削除することが、（即ちデータベーステーブル２３０ａに関連する任意の仮想クローンによって行われるその後のクエリがレコード又はその任意の部分を返さないように）レコードからバージョン属性をなくすことによって達成される。例えば削除を要求している仮想クローンが属する祖先パス内に存在するバージョンＩＤを削除されているレコードが有する場合、削除はこのように達成することができる。しかし、削除要求が要求側の仮想クローンの祖先パス及び削除を要求していない別のパスによって共有されるバージョンＩＤを有するレコードを参照する場合、削除は参照されているレコードをデータベーステーブル２３０ａから削除することによって、及び１つ又は複数の新たなレコードをデータベース２３０に追加することによって達成することができ、１つ又は複数の新たなレコードは（即ち関連データが他のパス沿いの仮想クローンにとってアクセス可能なままであるように）削除を要求していない他のパス（又は複数のパス）を参照する関連バージョンＩＤを有する。
【００３４】
[0045]  他の実装形態では、データベーステーブル２３０ａ内のレコードの削除を達成するために、データベーステーブル２３０ａの各レコードに（真又は偽の値を取る）「削除済み」属性を追加することができ、それにより（１）削除を要求している仮想クローンの祖先パス上にしか存在しないバージョンＩＤについてレコードを削除することがそのレコードの「削除済み」属性を「真」に変えることによって実現され、（２）削除を要求している仮想クローンの祖先パス及び別のパスによって共有されるバージョンＩＤを有するレコードを削除することが、（ｉ）削除を要求している仮想クローンのバージョンＩＤを有する新たなレコードをデータベーステーブル２３０ａ内で定め、新たに作成したレコードの「削除済み」属性を「真」に設定すること、及び（ｉｉ）他のパス上の仮想クローンのバージョンＩＤを有する新たなレコードをデータベーステーブル２３０ａ内で定め、新たに作成したレコードの「削除済み」属性を「偽」に設定することによって達成される。
【００３５】
[0046]  図４Ｆへと続き、３３４で、バナナの値を有するフルーツ属性を有するレコードを検索する要求Q(Banana)がＶ２によって受信される。３３６で、バナナのアイテム属性値及びバージョンＩＤ「Ｖ２又はＶ１」の両方を参照するようにクエリをQ(Banana,V2 又は V1)へと修正し、修正済みのクエリをデータベーステーブル２３０ａに対して実行する。「バナナ」及び「Ｖ２又はＶ１」の両方と一致するデータベーステーブル２３０ａ内の唯一のレコードはＦＩＤ１００２及びバージョンＶ２を有するレコードなので、（３３８に示すように）クエリはそのレコードを返す。
【００３６】
[0047]  図４Ｇは、仮想クローンＶ１、Ｖ２、及びＶ３のそれぞれに関するレコードを含む３４０におけるデータベーステーブル２３０ａ（ＦＩＤ＝１００１及びバージョン＝Ｖ１のレコードを削除せずに示す）と共に、図４Ｆのバージョンツリーを示す。３４０におけるデータベーステーブル２３０ａは、例えばデータベーステーブル２３０ａが競合制約と共に実装されない場合に生じることができ、図４Ａの３０４から開始し、（１）「パイ」を「リンゴ」から「洋梨」に変更する要求はＦＩＤ＝１００１、「洋梨」の「フルーツ」属性の値、及びＶ３の「バージョン」属性の値を有する（３０６に示す）新たなレコードを追加すること、及びＦＩＤ＝１００１、「リンゴ」の「フルーツ」属性の値、及びＶ１の「バージョン」属性の値を有する（３０４に示す）レコードを保持することをもたらし、（２）バナナパンを追加する（ＦＩＤ＝１００２、「パン」の「アイテム」属性の値、「バナナ」の「フルーツ」属性の値、及びＶ２の「バージョン」属性の値を有するレコードをデータベーステーブル２３０ａに追加することを引き起こす）要求がＶ２によって行われた。
【００３７】
[0048]  ３４０におけるデータベーステーブル２３０ａの実装が競合制約を守らないという仮定を続け、「パイ」の「アイテム」属性の値を参照するＶ２において受信されるクエリは、Ｖ２及びＶ１の両方を同時に検索するようにプロセッサによって修正されない。代わりに、プロセッサは「パイ」及び「Ｖ２」の値と一致するレコードを最初に検索する。かかるレコードは３４０においてデータベーステーブル２３０ａ内にないので、プロセッサは次に「パイ」及び「Ｖ１」の値と一致するレコードを求めてデータベース２３０をクエリする（即ちバージョンツリーを上がって行く）。データベーステーブル２３０ａ内で単一のレコード（ＦＩＤ＝１００１、アイテム＝パイ、フルーツ＝リンゴ、バージョン＝Ｖ１）が見つかり、そのレコードが返されクエリが終了する。Ｖ３に対して行われる同様のクエリはレコード（ＦＩＤ＝１００１、アイテム＝パイ、フルーツ＝洋梨、バージョン＝Ｖ３）を返し、それはＶ３が最初に検索され、レコードが識別されるのでクエリが終了し、祖先パスに沿ってＶ１の検索まで進まないからである。代わりに、「全てのパイ」を求めるクエリがＶ３において受信される場合、プロセッサは「パイ」及び「Ｖ３」の値と一致するレコードをデータベーステーブル２３０ａで最初に検索し、それにより第１のレコード（ＦＩＤ＝１００１、アイテム＝パイ、フルーツ＝洋梨、バージョン＝Ｖ３）を識別する。次いでプロセッサは、「アイテム」属性について「パイ」の値を含む任意の更なるレコードを求めて（祖先パスに沿って）Ｖ１を検索することによって続行し、第２のレコード（ＦＩＤ＝１００１、アイテム＝パイ、フルーツ＝リンゴ、バージョン＝Ｖ１）を識別する。第１のレコード及び第２のレコードのＦＩＤが（例えばレコードＦＩＤの比較に基づいてプロセッサによって検出されるように）一致するが、Ｖ３の検索がＦＩＤ＝１００１を有するレコードを既に識別しているのでバージョンＶ１を有するレコードはクエリ結果から除外される。代わりに、「パイ」の値と一致するが１００１と異なるＦＩＤを有する追加のレコードがＶ１の検索時に識別される場合、それらのレコードがクエリ応答の一部として返される。
【００３８】
ガベージコレクション
[0049]  一部の実装形態では、階層ツリー（本明細書では「バージョンツリー」とも呼ぶ）及び／又は階層ツリーの表現が、メモリに動作可能に且つ通信可能に結合されるプロセッサ（例えば図１の高速コピア１１５を実行するプロセッサ１１１等）によって行われるインクリメンタルガベージコレクションの一種により、削減された形で及び／又はより最適な形で非一時的メモリ内に保たれ及び／又は記憶される。かかる実装形態では、階層ツリーの各ノードが仮想クローン及び一連の複数の整数のシーケンスＩＤの終点を表す２つのシーケンスＩＤに関連する。例として、一連のシーケンスＩＤ  １０、１１、１２、及び１３をシーケンスＩＤペア（１０，１３）によって表すことができる。シーケンスＩＤ  ４２とだけ関連するノードは、シーケンスＩＤペア（４２，４２）と示す。本明細書で使用するとき、シーケンスＩＤはバージョンＩＤと異なるように定義する。シーケンスＩＤは、階層ツリーの仮想クローンが生成された順番に関する。そのため、特定の仮想クローンのシーケンスＩＤ及びバージョンＩＤは同じ値を有することができ、又は異なってもよい。かかる一部の実装形態では、図５の図（ａ）〜（ｇ）に示すように、バージョンツリーは（ａ）においてツリーに拡張する前、最初は単一のノード（１，１）しか含まない。高速コピーイベントがバージョンツリー内の新たなノードの作成及び／又は定義を引き起こすたび、次の整数のシーケンスＩＤがその新たなノードに順番に割り当てられる。そのため、バージョンツリーに追加される第２のノードにはシーケンスＩＤ（２，２）が割り当てられ、Ｎ番目のノードにはシーケンスＩＤ（Ｎ，Ｎ）が割り当てられる。本明細書で使用するとき、ノードＸにシーケンスＩＤペア（Ａ，Ｂ）が指定され、ノードＹにシーケンスＩＤペア（Ｂ＋１，Ｃ）が指定される場合、ノードＸは「後継」ノードＹを有する。換言すれば、ＹはＸのシーケンスＩＤ範囲の直後に来るシーケンスＩＤ範囲を表す。メモリ内の（及びデータベース内の）データ構造は、バージョンツリーのノードごとに、自らの後継であるノードへの参照を記憶することができる。後継関係は図５の破線で表す。本明細書で使用するとき「後継」及び「子孫」は（相互排他的ではないが）異なる概念であることに留意されたい。例えば前のノードの後継であるノードは、必ずしもその前のノードの子孫ではなく（例えば図５の（ａ）において、ノード（６，６）はノード（５，５）の後継だがノード（５，５）の祖先パス上の子孫ではなく）、前のノードの子孫ノードは必ずしもその前のノードの直の後継ではない（例えば図５の（ａ）において、ノード（６，６）はノード（３，３）の子孫だがノード（３，３）の直の後継ではない）。
【００３９】
[0050]  一部の実装形態では、メモリ内に記憶されるノードのための（例えばバージョンツリーから冗長性を除去し、性能及び効率を高め、記憶域及び／又は資源消費を減らす等するための）（例えばノードＸ及びその後継Ｙノードを含む）「シーケンス更新」が高速コピーソフトウェア（例えば図１の高速コピア１１５、１２５）を実行するプロセッサによって行われ、プロセッサはバージョンツリーを記憶するメモリと動作可能に通信する。シーケンス更新は次のように達成される。まず、（Ａ，Ｂ）のシーケンスＩＤ範囲を有するノードＸが、（Ｂ＋１，Ｃ）のシーケンスＩＤ範囲を有する後継Ｙを有し、ノードＸ及びＹを含む一連のノードが更新されると仮定する。（Ａ，Ｃ）のシーケンスＩＤ範囲を有する（即ちノードＸの第１の終点及びノードＹの第２の終点を有する）新たなノードＺを定めることができる。次に、ノードＸ又はノードＹに対するバージョンツリー内の他のノードの（例えば図５の実線及び破線で表す）任意の関係が更新され、それによりそれらのノードはもはやノードＸ若しくはＹに接続せず及び／又はノードＸ若しくはＹを参照せず、代わりにノードＺに接続し及び／又はノードＺを参照する。ノードＸ及びＹはバージョンツリーから除去／削除する（及びそれに応じて関連するデータベーステーブルから削除する又は削除済みとして注釈を付ける）ことができ、それによりシーケンス更新イベントを完了する。一部の実装形態では、シーケンス更新がノードであって、そのノードの後継でもある単一の子ノードだけを有する、ノードをもたらす場合、そのノード及びその単一の子ノードを含む別のシーケンス更新を（例えばノードがそのノードの後継でもある単一の子ノードだけを有するという条件を検出したとき自動で）上記と同様のやり方で行うことができる。
【００４０】
[0051]  一部の実装形態では、バージョンツリーからノードＸを削除することが次のように達成される。まず、ノードＸがバージョンツリー内に存在する親ノードを有する場合、ノードＸとその親ノードとの間の（例えば図５に示すバージョンツリー内の実線によって表す）関係を除去する。次にノードＸが後継ノードを有する場合、その後継ノードに新たなシーケンスＩＤを割り当て、ノードＸを削除する。或いはノードＸが後継ノードを有さない場合、ノードＸを単に削除する。ノードＸの前の親ノードが自らから生じる子ノードを現在有していない場合は前の親ノードを削除する。ノードＸを後継として有していたノードＷがあり、ノードＷが現在１つの子ノードしか有さず、その子が自らの後継である場合、ノードＷの子ノードに新たなシーケンスＩＤを割り当てる。
【００４１】
[0052]  上記の任意の削除イベント又はシーケンス更新イベントは新たに子を有さないノードをもたらす場合があり、そのため別の削除を引き起こす可能性がある。或いは又は加えて、上記の任意の削除イベント又はシーケンス更新イベントは自らの後継である単一の子ノードを有する新たなノードをもたらす場合があり、そのため別のシーケンス更新イベントを引き起こす可能性がある。従って、単一のシーケンス更新又は削除によって引き起こされるシーケンス更新及び削除の連鎖があり得る。一部の実装形態では、本開示のシステムが連鎖型のガベージコレクションを行うように構成され、他の形式のガベージコレクションはバージョンツリーに対して行われない。本明細書に記載の（及びプロセッサによって実行される）インクリメンタルガベージコレクション方法は、作成されるバージョンツリー内であり得る／許容可能な単純化（又はその既定の部分集合）を（例えばほぼ継続的に及び／又はほぼリアルタイムで）自動認識し、実行し／実施し／引き起こすことができる。改正された／単純化されたバージョンツリー（例えば図５（ｄ）のバージョンツリーを置換する図５（ｅ）のバージョンツリー）の表現は、後のアクセスのためにメモリ内に記憶することができる。
【００４２】
[0053]  一部の実装形態では、削除イベントがインクリメンタルガベージコレクションプロセスを引き起こすことができる。例えば図５（ａ）に示すようにバージョンツリーが表現される場合、破線矢印は後継ノードへの参照を表す。高速コピー可能データベースの一部の実装形態では、葉ノードだけを削除することができる。換言すれば、高速コピーソフトウェアは、或る「バージョン」が「葉」ノードに関連する場合にのみそのバージョンを削除するように構成され得る。「葉ノード」は子を有さないノードとして定義する（図５では子ノードを実線によって表す）。破線は葉ノードの識別中は無視すべきである。
【００４３】
[0054]  ユーザが図５の（ａ）において陰影付けしてある葉ノード（５，５）の削除を要求したと仮定する。葉ノード（５，５）の削除後、バージョンツリーは図５の（ｂ）に示すように見える。（ｂ）のバージョンツリーは、ノード（６，６）にシーケンスＩＤペア（５，６）を割り当て、次いで（ノード（４，４）をノード（５，６）に接続する破線によって示すように）自らの後継としてノード（５，６））を参照するようにノード（４，４）を更新するシーケンス更新の結果である。（２，２）である前のノード（５，５）の親ノードは依然として子ノード（ノード（４，４））を有し、自らの唯一の子として自らの後継ノード（ノード（３，３））を有さず、そのためこの削除プロセスは図５の（ｂ）に示すバージョンツリーで終わることに留意されたい。
【００４４】
[0055]  次に、ユーザが（図５の（ｂ）において陰影付けしてある）ノード（４，４）の削除を要求したと仮定する。ノード（４，４）を削除するこの要求は幾つかのアクションを引き起こし得る。まずノード（４，４）は親ノード（２，２）を有するので、図５の（ｂ）において実線で示すノード（２，２）とノード（４，４）との間の関係を除去する。更に、図５の（ｃ）に示すようにノード（５，６）にシーケンスＩＤペア（４，６）を割り当てるようにシーケンス更新を行い、今度はノード（３，３）とノード（４，６）との間の更新済みの後継関係が示される（ノード（４，６）はノード（３，３）の後継である）。上記のアクションの結果、（図５の（ｃ）に示すように）ノード（２，２）はもはや子ノードを一切有さない。そのため及び／又はこの状態に応答し、且つ（ノード（２，２）の子孫ノードがその除去前に過去に生成されている結果として）ノード（２，２）によってクエリをもはや行えないことにより、この削除プロセスは図５の（ｄ）に示すバージョンツリーをもたらすノード（２，２）の削除を自動で続行することによって「連鎖」し得る。この段階においてノード（１，１）には１つの子ノード（ノード（２，３））しかなく、その子はノード（１，１）の後継ノードである。従って上記で解説したように、子ノード（２，３）に新たなシーケンスＩＤペア（１，３）を割り当てるようにシーケンス更新を行い、図５の（ｅ）に示すバージョンツリーをもたらすことができ、この時点で連鎖が終了する。換言すれば、図５の（ｅ）に示すバージョンツリーは、ノード（４，４）を削除するユーザの要求の最終結果である。
【００４５】
[0056]  次に、ユーザが（図５の（ｅ）において陰影付けしてある）葉ノード（４，６）の削除を決めたと仮定する。この削除イベントは、図５の（ｆ）に示すようにバージョンツリーが見えるようにバージョンツリーの変形をもたらし、ノード（４，７）（ノード（１，３）の子ノード）に新たなシーケンスＩＤペア（１，７）が割り当てられ、図５の（ｇ）に示す最終結果（単一のノード（１，７））がもたらされるように、それ自体が最終的なシーケンス更新を自動で引き起こす。ガベージコレクションが進むにつれ、例えば図５の（ｇ）において全てのレコードが同じバージョン属性（例えば「７」）を含むように、関連するデータベーステーブルへの対応する変更を加えることができる。（例えば図５の（ｇ）において）１つのノードしか残らない段階（即ちバージョンツリーがガベージコレクションされ、サイズが低減されるとき）の前に、データベーステーブル（例えば図４Ａ〜図４Ｇのデータベーステーブル２３０ａ等）のレコードは残存しているノードを参照するように修正することができ、又は（例えばそのレコードに一意に関連するノードの削除に応じて）削除することができる。
【００４６】
[0057]  図６は、一実施形態による、高速コピーデータベースのためのプロセッサによって実施されるガベージコレクション（又は連鎖削除）方法４００のプロセス流れ図である。図６に示すように、方法４００は、４３０で仮想クローンの階層ツリーを生成することから始まる。その後４３２で、仮想クローンの階層ツリーから第２の仮想クローンを削除するための命令を受信する。第２の仮想クローンを削除するための命令に応答し、４３４で、第３の仮想クローンの後継関係を修正する。更に第２の仮想クローンを削除するための命令に応答し、４３６で第２の仮想クローンを削除する。４３８で、第２の仮想クローンの削除後に、仮想クローンの階層ツリーの第１の仮想クローンに子の仮想クローンが残っているかどうかをプロセッサが評価する。第２の仮想クローンの削除後に仮想クローンの階層ツリーの第１の仮想クローンに子の仮想クローンが残っているが、その子が第１の仮想クローンの後継ではない場合はこのプロセスは終了する。第２の仮想クローンの削除後に仮想クローンの階層ツリーの第１の仮想クローンに子の仮想クローンが残っており、その子が第１の仮想クローンの後継である場合、上記で解説したようにシーケンス更新を行うことができる。第２の仮想クローンの削除後に仮想クローンの階層ツリーの第１の仮想クローンに子の仮想クローンが残っていない場合、４４０で仮想クローンの階層ツリーから第１の仮想クローンを削除する。
【００４７】
[0058]  図７は、一実施形態による、高速コピーデータベースのためのプロセッサによって実施される更なるガベージコレクション（又は連鎖削除）方法５００のプロセス流れ図である。図７に示すように、方法５００は、５３０で仮想クローンの階層ツリーを生成することから始まる。その後５３２で、仮想クローンの階層ツリーから第１の仮想クローンを削除するための命令を受信する。第１の仮想クローン（例えば図５のノード（４，４））を削除するための命令に応答し、５３４で、第２の後継仮想クローン（例えば図５のノード（５，６））の後継関係を修正する。５３６で、第１の仮想クローンを削除する。次いで５３８で、第４の仮想クローン（例えば図５のノード（３，３））の後継関係を修正し、第４の仮想クローンは第１の仮想クローンの祖先である第３の仮想クローン（例えば図５のノード（２，２））の後継である。次いで５４０で、第３の仮想クローンを削除する。
【００４８】
[0059]  図８Ａ〜図８Ｄは、一実施形態による、高速コピーデータベースシステムの実装形態の一例を示す図である。図８Ａに示すように、８００で（及び最初の時点ｔ＝０において）、ノード「Jane」におけるデータベースの第１のインスタンス８３０Ａが、データベースインスタンス８３０Ａから依存する３つの仮想クローンＶ１、Ｖ２、及びＶ３を含む階層ツリーの一部を形成する。ノードJaneにおけるデータベースインスタンス８３０Ａは、ＲＩＤ、名前、ランク、及びバージョンの属性を有するデータベーステーブルを含む。８００では、データベーステーブル内に２つの投入レコード、つまり名前＝Smithのレコードと名前＝Jonesのレコードとがある。８００における仮想クローンＶ１は過去の「第１の」合意イベントに関連することができる。８００における仮想クローンＶ２は、（例えばトランザクションデータ等の新たなデータが受信されるとき、データベーステーブルが進行中のタリー又は状態を反映するように）データベース８３０Ａのデータベーステーブルに対してリアルタイムの又はほぼリアルタイムの編集を行うために使用することができる一方、８００における仮想クローンＶ３はデータベース８３０Ａのデータベーステーブルに対して合意後の編集を行うために確保しておくことができる。同じく図８Ａには、８０２で（及び最初の時点ｔ＝０において）ノード「Bob」におけるデータベースの第２のインスタンス８０３Ｂが示されており、このインスタンスは同じくそれぞれデータベースインスタンス８３０Ｂの直接依存である２つの仮想クローンＶ１及びＶ２を含む別の階層ツリーの一部を形成する。ノードBobにおけるデータベースインスタンス８３０Ｂは、ＲＩＤ、名前、ランク、及びバージョンの属性を有するデータベーステーブルを同じく含む。８０２では、データベーステーブル８３０Ｂ内に２つの投入レコード、つまり名前＝Smithのレコードと名前＝Jonesのレコードとがある。換言すれば、Janeのノードにおけるデータベースインスタンス８３０Ａ及びBobのノードにおけるデータベースインスタンス８３０Ｂのデータベーステーブルが、第１の時点ｔ＝０において同じレコードを含む。Janeのノードにおけるデータベーステーブル８３０Ａ及びBobのノードにおけるデータベーステーブル８３０Ｂ内のレコードのそれぞれが、Ｖ１のバージョン属性の値を含むことに留意されたい。８０２における仮想クローンＶ１は、新たな子の仮想クローンＶ２及びＶ３の生成を引き起こした過去の「第１の」合意イベントに関連することができる。８０２における仮想クローンＶ２は、データベース８３０Ｂのデータベーステーブルに対してリアルタイムの又はほぼリアルタイムの編集を行うために使用することができる一方、８０２における仮想クローンＶ３はデータベース８３０Ｂのデータベーステーブルに対して合意後の編集を行うために確保しておくことができる。
【００４９】
[0060]  図８Ｂでは同期イベントが生じ、その間データ（関係するトランザクションと同時にリアルタイムで又はほぼリアルタイムで受信され得る「イベント」、例えばトランザクションデータと本明細書では呼ぶことがある）が、Janeのノード８３０Ａ、Bobのノード８３０Ｂ、並びに任意選択的にJaneのノード８３０Ａ及び／又はBobのノード８３０Ｂとネットワーク通信する１つ又は複数の追加のノードのうちの２つ以上の間でやり取りされる。同期中、Janeのノード８３０Ａは、「名前」の属性について「Smith」の値を有するレコードの「ランク」の属性の値を１インクリメントすべきだと規定する第１のイベントを第１の時点において受信する。第１のイベントを受信することに応答し、Janeのノード８３０Ａにおけるプロセッサが「Smith」のための新たなレコードを生成し、「バージョン」の属性についてＶ２の値、「ＲＩＤ」の属性について１００１の値、及び「ランク」の属性について２＋１＝３（不図示）の値をそのレコード内に含める。更に、第１のイベントを受信することに応答し、Janeのノード８３０Ａにおけるプロセッサは、バージョン属性の値がＶ１ではなくＶ３であるようにデータベーステーブル内の第１のレコードを修正する。更に、同期中（同じ同期イベント中又は別個の同期イベント中）、Janeのノード８３０Ａは、「名前」の属性について「Smith」の値を有するレコードの「ランク」の属性の値を１０に変更すべきだと規定する第２のイベントを第１の時点の後の第２の時点において受信する。第２のイベントを受信することに応答し、Janeのノード８３０Ａにおけるプロセッサは、（図８Ｂの８０４に示すように）レコードが「ランク」の属性について１０の値を有するように、名前の属性について「Smith」の値、及びバージョンの属性について「Ｖ２」の値を有するレコードを修正する。
【００５０】
[0061]  同期（Janeのノード８３０Ａと同じ又は別個の同期イベント）中、Bobのノード８３０Ｂは、Jane ８３０Ａがイベントを受信したのと逆順に第１のイベント及び第２のイベントを受信する。より詳細には、Bobのノード８３０Ｂは、「名前」の属性について「Smith」の値を有するレコードの「ランク」の属性の値を１０に変更すべきだと規定する第１のイベントを第１の時点において受信する。第１のイベントを受信することに応答し、Bobのノード８３０Ｂにおけるプロセッサが「Smith」のための新たなレコードを生成し、「バージョン」の属性についてＶ２の値、「ＲＩＤ」の属性について１００１の値、及び「ランク」の属性について１０（不図示）の値をそのレコード内に含める。更に、第１のイベントを受信することに応答し、Janeのノード８３０Ａにおけるプロセッサは、バージョン属性の値がＶ１ではなくＶ３であるようにデータベーステーブル内の第１のレコードを修正する。更に、同期中（同じ同期イベント中又は別個の同期イベント中）、Bobのノード８３０Ｂは、「名前」の属性について「Smith」の値を有するレコードの「ランク」の属性の値を１インクリメントすべきだと規定する第２のイベントを第１の時点の後の第２の時点において受信する。第２のイベントを受信することに応答し、Bobのノード８３０Ｂにおけるプロセッサは、（図８Ｂの８０６に示すように）レコードが「ランク」の属性について１１の値を有するように、名前の属性について「Smith」の値、及びバージョンの属性について「Ｖ２」の値を有するレコードを修正する。
【００５１】
[0062]  Janeのノード及びBobのノードにおいてＶ２経由で受信されるイベント／データ（トランザクションデータ等）は、Janeのノード及びBobのノードそれぞれの関連するメモリ内に、例えば分散非循環グラフ（ＤＡＧ）、ハッシュグラフ、データチェーン、ブロックチェーン、又は他の任意の適切なデータ構造若しくは形式内に記憶することができる。適合するデータ構造を含む更なる実装の詳細が、参照によりその全内容を本明細書において全ての目的のために援用する米国特許第９，６４６，０２９号の中に記載されている。
【００５２】
[0063]  同期イベントの後、及び図８Ｃの８０８に示すように、Janeのノード８３０Ａ及びBobのノード８３０Ｂのプロセッサが（例えば図１の合意命令１１６及び１２６等の合意命令を実施した結果として）合意に達する。換言すれば、Janeのノード８３０Ａの（そのノードのメモリ内に記憶される高速コピーソフトウェアを実行する）プロセッサによって実施される合意アルゴリズム、及びBobのノード８３０Ｂの（例えばそのノードのメモリ内に記憶される高速コピーソフトウェアを実行する）プロセッサによって実施される合意アルゴリズムが、合意に達したことを検出し及び／又はそのように判定する。合意は、非限定的な例として、合意アルゴリズムによって定められる「ラウンド」が完了したとき、階層ツリーが開始されてから所定の時間が経過したとき、前の合意イベントから所定の時間が経過したとき、そのノードのデータベーステーブルの所与のレコードについて他のノードから所定の投票数が受信されているとき、所定数の同期イベントが生じたとき等の条件のうちの１つ又は複数の下で達することができる。図８Ｃに示すように、Smithのランクを最初にインクリメントし、次に１０の値に変更することが受信イベントの正しい順序付けであるのが合意の結果であった。そのため、名前の属性についてSmithの値を有し、バージョンの属性についてＶ２の値を有するレコードのランク属性の正しい現在値は「１０」である。同様に述べると、８０８に示すようにこのレコードのランク値は「１０」であるようにＶ３によって更新される。合意に達した結果、仮想クローンＶ３に依存し／そこから下降する１対の新たな仮想クローンＶ４及びＶ５が生成される。８０８において新たに生成される仮想クローンＶ４は、Janeのノード８３０Ａにおけるデータベースインスタンスのデータベーステーブルに対してリアルタイムの又はほぼリアルタイムの編集を行うために後で使用することができる一方、８０８における仮想クローンＶ５はJaneのノード８３０Ａにおけるデータベースインスタンスのデータベーステーブルに対して合意後の編集を行うために確保しておくことができる。換言すれば、新たな仮想クローンＶ４及びＶ５は、仮想クローンＶ２及びＶ３のそれぞれによって前に行われていた機能を実行することができる。一部の実装形態では、仮想クローンＶ４及びＶ５が生成されると、データベーステーブルに対する編集は（たとえ仮想クローンＶ４及びＶ５が後で削除されても）仮想クローンＶ３によってもはや行うことができないことに留意されたい。
【００５３】
[0064]  図８Ｃの解説と同様に、図８Ｄにおいて、Bobのノード８３０Ｂが（例えば図１の合意命令１１６及び１２６等の合意命令を実施した結果として）合意に達する。換言すれば、Janeのノード８３０Ａの（例えばそのノードのメモリ内に記憶される高速コピーソフトウェアを実行する）プロセッサによって実施される合意アルゴリズム、及びBobのノード８３０Ｂの（そのノードのメモリ内に記憶される高速コピーソフトウェアを実行する）プロセッサによって実施される合意アルゴリズムが、合意に達したことを検出し及び／又はそのように判定する。図８Ｄに示すように、Bobのノード８３０Ｂにおけるデータベースインスタンスのデータベーステーブルは、名前の属性についてSmithの値を有し、バージョンの属性についてＶ２の値を有するレコードのランク属性について「１０」の正しい現在値を今では反映している。同様に述べると、８１０に示すようにこのレコードのランク値は「１０」であるようにＶ３によって更新される。図８Ｃの解説と同様に、及び第２の合意に達した結果、仮想クローンＶ３に依存し／そこから下降する１対の新たな仮想クローンＶ４及びＶ５が生成される。８０８において新たに生成される仮想クローンＶ４は、Bobのノード８３０Ｂにおけるデータベースインスタンスのデータベーステーブルに対してリアルタイムの又はほぼリアルタイムの編集を行うために後で使用することができる一方、８０８における仮想クローンＶ５はBobのノード８３０Ｂにおけるデータベースインスタンスのデータベーステーブルに対して合意後の編集を行うために確保しておくことができる。換言すれば、新たな仮想クローンＶ４及びＶ５は、仮想クローンＶ２及びＶ３のそれぞれによって前に行われていた機能を実行することができる。一部の実装形態では、仮想クローンＶ４及びＶ５が生成されると、データベーステーブルに対する編集は（たとえ仮想クローンＶ４及びＶ５が後で削除されても）仮想クローンＶ３によってもはや行うことができないことに留意されたい。
【００５４】
[0065]  図８Ａ〜図８Ｄは、データベーステーブル内のレコードの現在の「収支」、「タリー」、又は「状態」の正確性を確実にするためにイベント（例えばトランザクション）の正しい順序付けを決定するものとして合意を図示し説明したが、代わりに又は加えて合意は、資産の現在の所有者を決定すること、データベーステーブル内のレコードの正しい順序付けを決定すること、商品の生産物流管理又は権原連鎖を決定すること等のうちの１つ又は複数の目的でイベントの正しい順序付けを決定するために使用することができる。
【００５５】
[0066]  本明細書に記載の一部の実施形態では、機器（例えば図１の計算装置１１０及び／又は計算装置１２０）がプロセッサ及びプロセッサと電子通信するメモリを含む。メモリ（例えば図１のメモリ１１２及び／又はメモリ１２２）は複数のレコードを含むデータベーステーブルを記憶し、複数のレコードからの各レコードはバージョン識別子を有する複合キーを含む。メモリは、データベーステーブルの第１の仮想クローン及びデータベーステーブルの第２の仮想クローンを生成することをプロセッサに行わせるために実行可能な命令を含む。メモリは、第１の仮想クローンにおいてクエリを受信すること、及び第１の仮想クローンにおいてクエリを受信することに基づいて第１の仮想クローンに関連するバージョン識別子を含む修正済みのクエリを定めるためにクエリを修正することをプロセッサに行わせるために実行可能な命令も含む。メモリは、（１）クエリを満たす１組のレコードからの各レコード、及び（２）第１の仮想クローンに関連するバージョン識別子の祖先パスに関連するバージョン識別子を有する１組のレコードからの各レコードに基づき、複数のレコードからの１組のレコードを含む応答を生成するために修正済みのクエリを使用してデータベーステーブルをクエリすることをプロセッサに行わせるために実行可能な命令も含む。メモリは、クエリへの応答として１組のレコードを含む応答を送信することをプロセッサに行わせるために実行可能な命令も含む。かかる一部の実施形態では、複数のレコードからの各レコードの複合キーが、その複合キーのバージョン識別子及びデータ部分を含む。複数のレコードは、（１）データ部分の値及び第１の仮想クローンに関連するバージョン識別子を含む複合キー、又は（２）データ部分の値及び第２の仮想クローンに関連するバージョン識別子を含む複合キーのうちの１つだけが任意の所与の時点においてデータベーステーブル内に存在するように構成することができる。
【００５６】
[0067]  一部の実施形態では、メモリが、第１の仮想クローンによって受信される挿入命令に応答してデータベーステーブルにレコードを追加することをプロセッサに行わせるために実行可能な命令も含む。レコードは、データ及び第１の仮想クローンに関連するバージョン識別子を有する複合キーを含み、そのため（１）第１の仮想クローンにおいて後で受信されデータを参照するクエリがレコードを返し、（２）データを求めて第３の仮想クローンにおいて後で受信されるクエリはレコードを返さない。
【００５７】
[0068]  一部の実施形態では、メモリが、データベーステーブルの第１のレコードのフィールドの値を第１の値から第２の値に更新するための、及び第３の仮想クローンによって受信される命令に応答し、データベーステーブルに第２のレコードを追加することをプロセッサに行わせるために実行可能な命令も含む。第２のレコードは、第２の値及び第３の仮想クローンに関連するバージョン識別子を有する複合キーを含む。この命令は、第１のレコードのフィールドの値を更新するための命令に応答し、第３の仮想クローンに関連するバージョン識別子を含まないように第１のレコードの複合キーを修正するために更に実行可能とすることができ、そのため第３の仮想クローンにおいて後で受信され、フィールドを参照するクエリが第２のレコードを返し、第１の仮想クローンにおいて受信され、フィールドを参照するクエリが第１のレコードを返す。
【００５８】
[0069]  一部の実施形態では、メモリが、複数のレコードからレコードを削除するための、及び第３の仮想クローンによって受信される命令に応答し、第３の仮想クローンに関連するバージョン識別子を含まないようにレコードの複合キーのバージョン識別子を修正することをプロセッサに行わせるために実行可能な命令も含み、そのため第３の仮想クローンにおいて後で受信されるレコードのためのクエリがレコードを返さず、第１の仮想クローンにおいて後で受信されるレコードのためのクエリがレコードを返す。
【００５９】
[0070]  一部の実施形態では、応答が第１の応答であり、修正済みのクエリが第１の修正済みのクエリである。命令は、第１の応答がヌルの場合に第２の仮想クローンのバージョン識別子を含む第２の修正済みのクエリを生成することをプロセッサに行わせるために更に実行可能とすることができ、第２の仮想クローンは第１の仮想クローンにとっての祖先である。命令は、（１）第２の修正済みのクエリを満たす第２の応答の１組のレコードからの各レコード、及び（２）第２の仮想クローンのバージョン識別子の祖先パスに関連するバージョン識別子を有する第２の応答の１組のレコードからの各レコードに基づき、複数のレコードからの１組のレコードを含む第２の応答を生成するために第２の修正済みのクエリを使用してデータベーステーブルをクエリし、クエリへの応答として１組のレコードを含む第２の応答を送信することをプロセッサに行わせるために更に実行可能であり得る。
【００６０】
[0071]  一部の実施形態では、この命令は、第１の仮想クローンが第２の仮想クローンの子孫であるという指示をメモリ内に記憶することをプロセッサに行わせるために更に実行可能である。
【００６１】
[0072]  一部の実施形態では、この命令が、データベーステーブルの第３の仮想クローンを生成することであって、第３の仮想クローンは第１の仮想クローンの祖先でも子孫でもなく、複数のレコードはデータ部分の値及び第３の仮想クローンに関連するバージョン識別子を含む複合キーを有するレコードを含む、生成することをプロセッサに行わせるために更に実行可能である。
【００６２】
[0073]  一部の実施形態では、機器がプロセッサ及びプロセッサと電子通信するメモリを含む。メモリは、データベーステーブル及びプロセッサ実行可能命令を記憶する。プロセッサ実行可能命令は、データベーステーブルの複数の仮想クローンの表現を含む階層ツリーを生成することをプロセッサに行わせるための命令を含み、複数の仮想クローンは第１の仮想クローン（例えば図５のノード（２，２））、第１の仮想クローンの子の仮想クローンである第２の仮想クローン（例えば図５のノード（４，４））、及び第２の仮想クローンの後継仮想クローンである第３の仮想クローン（例えば図５のノード（５，６））を含む。プロセッサ実行可能命令は、第２の仮想クローンを削除するための命令に応答し、第３の仮想クローンに関連する後継関係を修正することをプロセッサに行わせるための命令も含む。プロセッサ実行可能命令は、第２の仮想クローンを削除するための命令に応答して第２の仮想クローンを削除することをプロセッサに行わせるための命令も含む。プロセッサ実行可能命令は、第２の仮想クローンを削除するための命令に応答し、第２の仮想クローンの削除後に第１の仮想クローンが子の仮想クローンを有さない場合、複数の仮想クローンから第１の仮想クローンを削除することをプロセッサに行わせるための命令も含む。
【００６３】
[0074]  一部の実施形態では、複数の仮想クローンが、第１の仮想クローンの後継仮想クローンである第４の仮想クローンを更に含む。命令は、第２の仮想クローンを削除するための命令及び第２の仮想クローンの削除後に第４の仮想クローンが第１の仮想クローンの唯一の子孫だという判定に応答し、第４の仮想クローンに関連する後継関係を修正することをプロセッサに行わせるために更に実行可能である。
【００６４】
[0075]  一部の実施形態では、この命令が、複数の仮想クローンからの且つ子の仮想クローンを有さない第４の仮想クローンを自動で識別すること、及び自動で識別することに基づいて第４の仮想クローンを削除することをプロセッサに行わせるために更に実行可能である。或いはこの命令は、複数の仮想クローンからの且つ子の仮想クローンを有さない第４の仮想クローンを自動で識別すること、並びに自動で識別することに応答して（１）複数の仮想クローンからの第５の仮想クローンに関連する後継関係を修正すること、及び（２）第４の仮想クローンを削除することをプロセッサに行わせるために更に実行可能であり得る。
【００６５】
[0076]  一部の実施形態では、この命令が、第３の仮想クローンに関連する後継関係を修正することに応答し、複数の仮想クローンから少なくとも１つの更なる仮想クローンを削除することを引き起こすことをプロセッサに行わせるために更に実行可能である。
【００６６】
[0077]  一部の実施形態では、後継関係が第１の後継関係であり、メモリが第１の後継関係を含む複数の後継関係を更に記憶する。
【００６７】
[0078]  一部の実施形態では、データベーステーブルが複数のレコードを含み、複数のレコードからの各レコードが、複数の仮想クローンからの仮想クローンに関連するバージョン識別子を含む複合キーを含む。
【００６８】
[0079]  一部の実施形態では、機器がプロセッサ及びプロセッサと電子通信するメモリを含む。メモリは、データベーステーブル及びデータベーステーブルの複数の仮想クローンの表現を含む階層ツリーを生成することをプロセッサに行わせるために実行可能な命令を記憶する。命令は、複数の仮想クローンから第１の仮想クローン（例えば図５のノード（４，４））を削除するための命令に応答し、第２の仮想クローン（例えば図５のノード（５，６））に関連する後継関係を修正することであって、第２の仮想クローンは第１の仮想クローンの後継仮想クローンである、修正すること、第１の仮想クローンを削除すること、第４の仮想クローン（例えば図５のノード（３，３））に関連する後継関係を修正することであって、第４の仮想クローンは第３の仮想クローン（例えば図５のノード（２，２））の後継仮想クローンであり、第３の仮想クローンは第１の仮想クローンの祖先仮想クローンである、修正すること、及び第３の仮想クローンを削除することを行うために実行可能とすることもできる。
【００６９】
[0080]  一部の実施形態では、この命令は、第２の仮想クローンが第４の仮想クローンの唯一の子孫仮想クローンであり且つ後継仮想クローンだと検出すること、及び第２の仮想クローンが第４の仮想クローンの唯一の子孫仮想クローンであり且つ後継仮想クローンだと検出することに応答して第２の仮想クローンを削除することをプロセッサに行わせるために更に実行可能である。
【００７０】
[0081]  一部の実施形態では、データベーステーブルが複数のレコードを含み、複数のレコードからの各レコードは、複数の仮想クローンからの仮想クローンに関連するバージョン識別子を含む複合キーを含む。
【００７１】
[0082]  一部の実施形態では、この命令が、第１の仮想クローンを削除するための命令に応答し、複数の仮想クローンから少なくとも１つの更なる仮想クローンを削除することを引き起こすことをプロセッサに行わせるために更に実行可能である。
【００７２】
[0083]  一部の実施形態では、この命令が、複数の仮想クローンからの且つ子孫仮想クローンを有さない第５の仮想クローンを自動で識別することをプロセッサに行わせるために更に実行可能である。この命令は、自動で識別することに応答し、第６の仮想クローンに関連する後継関係を修正すること、及び第５の仮想クローンを削除することを行うために実行可能とすることもできる。
【００７３】
[0084]  一部の実施形態では、メモリが、第２の仮想クローンに関連する後継関係及び第４の仮想クローンに関連する後継関係を含む複数の後継関係を更に記憶する。
【００７４】
[0085]  一部の実装形態では、(1001,N)等の所与の複合キーを有するレコードがテーブル内に存在する場合、そのテーブルが(1001,M)の複合キーを有する如何なるレコードも含まないことを競合制約が確実にし、Ｍはバージョンツリー内でＮの祖先であるバージョン番号である。例えばバージョンツリーが図８Ｃに示す通りであり、(1001,4)のキーを有するレコードがある場合、(1001,V3)又は(1001,V1)のキーを有するレコードが一切ないことが保証される。しかし(1001,2)のキーを有するレコードは存在することができ、それはツリー内でＶ２がＶ４の祖先ではないからである。
【００７５】
[0086]  一部の実装形態では、データベーステーブルの各レコード／行が１のバージョンＩＤを最初に含む。データベーステーブルは、本明細書に記載の高速コピー、追加、削除、又は修正を行う操作の結果として増大及び縮小し得る。
【００７６】
[0087]  一部の実装形態では、削除操作を次のように行うことができる。仮想クローン（又は「ビュー」）によって受信されるＳＱＬクエリが、削除するための１つ又は複数のレコードを参照し得る。そのような各レコードは次のように削除することができる。レコードがバージョンＮを有する場合、そのレコードを削除する。次に、階層ツリー（即ちデータベーステーブルインスタンス）のビューから「ルート」までの直接の祖先パス沿いの各仮想クローンについて、直接の祖先パス上にないそれらの仮想クローンの子がある場合、そのバージョンがＭに変更してある削除済みレコードのコピーをそれらの子のデータベーステーブルに追加する。例えば図４Ｂの階層ツリーを所与とし、(Pie,V2)のキーを有するレコードがＶ２によって削除される場合、そのレコードがテーブルから削除される。(Pie,V1)のキーを有するレコードがＶ２によって削除される場合、そのレコードが削除され、バージョンＶ３を有するそのレコードのコピーがテーブルに追加され、それはＶ３がＶ１の子であり且つデータベース２３０からＶ２までの直接の祖先パス上にないからである。バージョン番号が結果から削除されると、この削除操作は、Ｖ２によるその後の読み取りがパイの仮想主キーを有する如何なるレコードも返さないこと、及びＶ３によるその後の読み取りが削除前と同じ結果を返すことを確実にすることに留意されたい。加えて、かかる削除操作が競合制約を満たすテーブルに対して行われる場合、修正済みのテーブルは引き続き競合制約を満たす。
【００７７】
[0088]  一部の実装形態では、削除命令が或るレコードを削除すること、及びＫ＞０が成立する状態で異なるバージョンを有するＫ個の新たなレコードを追加することを命令する場合、この命令はレコードのバージョン番号を新たなバージョン番号の１つに変更し、（それぞれ異なるバージョン番号を有する）Ｋ−１個のコピーを作成することによって実施することができる。この最適化は１つの追加を節約し、かかる節約は基礎を成すデータベースにとって修正を実行することが追加を実行するよりも速い場合に有益であり得る（例えばデータベースの効率を高める）。
【００７８】
[0089]  他の実装形態では、「削除済み」のブール属性を各レコードに追加することができる。一例として図４Ｂの階層ツリーを所与とし、Ｖ２によって削除されるレコードがバージョンＶ２を有する場合、そのレコードの削除済み属性を偽から真に変更することができる。しかしＶ２によって削除されるレコードがバージョン１を有する場合、プロセッサはバージョンＶ２を有し削除済み属性を真に設定したレコードの新たなコピーを作成し及び／又は定めることができる。テーブルが競合制約を満たす必要がない場合、削除済み属性を偽に設定した状態でバージョンＶ１を有するレコードを残すことができる。しかしテーブルが競合制約を満たす必要がある場合、バージョンＶ３を有し削除済み属性を偽に設定したレコードの別のコピーを作成し及び／又は定めることができ、バージョンＶ１を有するレコードをテーブルから除去することができる。
【００７９】
[0090]  一部の実装形態では、挿入（即ちデータベーステーブル内にレコードを挿入するための）操作が、挿入しようとするレコードの仮想主キーと一致するレコードをまず削除し、次いでそれにより挿入操作を引き起こす挿入命令が受信された仮想クローンの親であるバージョン番号を有する新たなレコードを挿入することによって行われる。例えば図４Ｂの階層ツリーを所与とし、（例えば「ブラックベリー」の仮想主キー値を有する新たなレコードの挿入を命令する）挿入命令を含むＳＱＬクエリがＶ２によって受信される場合、ブラックベリーの仮想主キーを有するＶ２によってアクセス可能な任意のレコード（即ちＶ２の祖先パス内の仮想クローン、即ちＶ２又はＶ１と一致するバージョン属性の値を有する任意のレコード）をまず見つけて削除し、次いで複合キー(Blackberry,V2)を有する新たなレコードを追加するようにクエリを修正することができる。この追加操作は競合制約への準拠を守ることに留意されたい。
【００８０】
[0091]  一部の実装形態では、挿入操作（即ちデータベーステーブル内にレコードを挿入するための要求に応じたプロセス）が、その仮想主キーを使用してデータベーステーブルをまず読み取る（又はクエリする）ことによって行われる。挿入しようとするレコードと一致する結果が読み取り中に返される場合、レコードを挿入するための要求に応答してエラーメッセージを返すことができる。他方で、挿入しようとするレコードと一致する結果が返されない場合、要求を受信した仮想クローンの親であるバージョン番号を有するレコードをデータベーステーブル内に挿入する。例えば図４Ｂの階層ツリーを所与とし、Ｖ２によるＳＱＬ挿入操作がブラックベリーの仮想主キーを有するレコードを挿入する場合、この挿入操作は、上記の読み取り操作を使用し、ブラックベリーの仮想主キー及びＶ２又はＶ１のバージョン属性の値を有する任意のレコードについて読み取りをまず行うように修正される。この読み取りに対する任意の結果をクエリが返す場合、それは共通の祖先パスに関連する重複レコードを追加する試みなので、プロセッサは挿入操作に応答してエラーメッセージを返す。読み取りに対する結果をクエリが返さない場合、プロセッサは複合キー(Blackberry,V2)を有するレコードを追加する。この挿入操作は競合制約への準拠を守ることに留意されたい。
【００８１】
[0092]  一部の実装形態では、レコードＸに対する修正操作が、上記のようにＸの古いバージョンをまず削除し、上記のようにＸの修正済みのバージョンを追加／挿入することによって実施され得る。削除も挿入も競合制約への準拠を守るので、修正操作も競合制約への準拠を守る。
【００８２】
[0093]  一部の実装形態では、図４Ｂの階層ツリー等のバージョンツリーは、データベースに追加される又は関連付けられる別個のテーブル内で記述することができる。高速コピーデータベースシステムは、例えばクエリを素早く変換することができるように、メモリ内のバージョンツリー情報であることをキャッシュすることもできる。
【００８３】
[0094]  バージョンツリーが、一番下に小さいツリーがある長い連鎖である場合、バージョン比較を単純化することができる。例えばバージョンを多数の許容可能なバージョンと比較する代わりに、例えば「バージョン＜８０」と規定することにより、全て８０未満の多数のバージョン番号ではなく、そのリストの部分集合を比較に使用することができる。或いは、「バージョン＝１１又はバージョン＝１２又はバージョン＝１３又はバージョン＝１４」を明確に検索する代わりに、例えば「１０＜バージョン且つバージョン＜１５」の選択等の範囲を使用することができる。上記の内容は、例えば元のＳＱＬクエリを表すストリングをパーズし、その結果生じるパーズツリーを修正し、再びストリングに変換してから実際のデータベースにそのストリングを伝えることによって行うことができる。
【００８４】
[0095]  或いは他の例では、基礎を成すデータベースがビュー及びストアドプロシージャをサポートすることができる。その場合、データベースの高速コピーが作成されるとテーブルごとにビューを定めることができ、このことはテーブルのそのバージョンからの選択が上記で定めた通りに行われることを確実にする。ビューへの書き込みが上記のレコードコピーに変わるようにストアドプロシージャを作成することができる。
【００８５】
[0096]  一部の実装形態では、（例えばJavaからアクセスされる）高速コピー可能リレーショナルデータベースのためのシステムが、（例えばJavaで書かれた）高速コピー可能データベースプラットフォームにＳＱＬクエリを送信する（例えば同じくJavaで書かれた）ユーザプログラムを含み、高速コピー可能データベースプラットフォームはＳＱＬクエリを変換してからそれを実際のデータベースに伝える。例えばリレーショナルデータベースが「people」と名付けられた以下のテーブルを有すると仮定されたい。
【００８６】
【表１】
2021501931.tif 000003
【００８７】
[0097]  仮想主キーはid_であり、名前、年齢、及び州の３つの他の属性がある。（例えばプロセッサによって高速コピー可能データベースプロセスを実行している）高速コピー可能データベースシステムは、１つの隠れ属性version_を追加し、他の属性及びテーブル名に下線を追加することによってこれを高速コピー可能テーブルに変換することができる。
【００８８】
【表２】
2021501931.tif 000004
【００８９】
[0098]  この新たなテーブルは複合キー（id_,version_）を有し、id_は上記の仮想主キーと呼ぶことができる。そのため、今では２つのレコードがそのversion_が異なる限り同じid_を有することができる。上記の例は競合制約に準拠し、この例による操作はその準拠を守ることができる。他の何らかのテーブルがidの外部キーを有する場合、外部キーはidではなくid_と名付けられた属性と一致することを除き変更されないままである。元々、外部キーは仮想主キーpeople.idにリンクしており、これは外部キーがpeopleのテーブル内の最大で単一のレコードにリンクしていたことを意味する。しかし現在、外部キーがクエリ内で使用される場合、外部キーが幾つかのレコードのid_と一致する可能性があり、そのため外部キーは、クエリを行うために使用されているビューの祖先であるバージョンを有する、その１組のレコードの中の単一のレコードにリンクすると解釈される。競合制約に準拠する例では、競合制約の違反になるのでそのようなレコードは２つとあり得ない。そのため、外部キーのリンクは高速コピー可能データベースに適合することができる。
【００９０】
[0099]  一部の実装形態では、ユーザによって作成されるテーブルの名前及び属性に対する制約を強制することができる。例えば名前及び／又は属性が最大で基礎を成すデータベースの典型的なテーブル／属性のサイズよりも１文字短い長さ（例えば８０文字の代わりに７９文字の最大サイズ、又は６４文字の代わりに６３文字の最大サイズ）を有すると規定する規則を実装することができる。或いは又は加えて、名前及び／又は属性が下線で終わってはならないと規定する規則を実装することができる。かかる規則はテーブル及び属性を再命名することを可能にする。かかる規則は、特定の実装形態にとって有用な場合は元のテーブル名がストアドプロシージャと共にビューとして使用されることも可能にする。
【００９１】
[00100]  次に、例えばシステム（又はプロセッサ）がバージョン１に対して高速コピー操作を行って（以下に示すように）バージョン２及びバージョン３を作成すると仮定されたい。（プロセッサによって実行される）ユーザコードは、ＳＱＬクエリごとに読み取り及び書き込みの両方についてバージョン番号を提供することができ、そのバージョン番号がバージョンツリー内の葉のバージョンになる。この時点において、（プロセッサによって実行される）ユーザコードはバージョン１を直接読み取る又は書き込むことがもはやできず、それは読み取り及び書き込みがバージョンツリーの葉において行われるからである。システムが今度は次のようになり、操作は葉の仮想クローン（円）によって行われるものとして記載する。
【００９２】
【表３】
2021501931.tif 000005
【００９３】
[00101]  高速コピー操作はテーブルを全く変えなかった。高速コピー操作は、右側に示すバージョンツリーであって、ここでは不図示だが親と子の２つの属性を含む（例えば末尾に２本の下線を有する）versions__と実装形態によっては名付けられ得る専用テーブル内に記憶される、バージョンツリーを変えただけである。
【００９４】
[00102]  一部の実装形態では、データベースの或る特定のバージョンに送信されるＳＱＬクエリであるストリングをユーザプログラムが作成する。システムはそのストリングをパーズし、その結果生じるパーズツリーを修正し、それを再びストリングに変換し、その修正済みのストリングをＳＱＬクエリとして実際のデータベースに送信する。そのためユーザの観点からは、実際には高速コピーを表す単一の統合データベースと読み書きしているとき、多くのデータベースコピーの１つと読み書きしているかのように見える。
【００９５】
[00103]  ユーザが（例えばプロセッサを使用して）Daveのための新たなレコードを仮想クローン３によって追加すると仮定されたい。これにより以下のデータベーステーブルがもたらされる：
【００９６】
【表４】
2021501931.tif 000006
【００９７】
[00104]  次に、バージョン２によるクエリはDaveのための新たに作成されたレコードを無視する（即ち検出しない）が、バージョン３によるクエリはDaveを認識する。ユーザが今度は（例えばプロセッサを使用して）バージョン３の高速コピーを行い、以下のデータベーステーブルをもたらすと仮定されたい。
【００９８】
【表５】
2021501931.tif 000007
【００９９】
[00105]  Daveのレコードは「バージョン」の属性について３の値を含み、そのためそのレコードは仮想クローン４及び５によって行われるクエリによって返されるが、仮想クローン２へのクエリによっては返されない。次いでユーザが（例えばプロセッサを使用して）仮想クローン２によってBobをBobbieに変更すると仮定されたい。その結果生じるデータベーステーブルは下記の通りである。
【０１００】
【表６】
2021501931.tif 000008
【０１０１】
[00106]  この「変更」は、削除とその後に続く２つの追加によって実施されることに留意されたい。元のレコード（Bob,1）が削除され、３のバージョンと共にそのレコードのコピーが追加され、それは３が２から１へのパス上のノードの子だがそれ自体はそのパス上にないからである。次いで、変更された新たなレコードが２のバージョンと共に追加され、それはレコードが仮想クローン２によって修正されているからである。
【０１０２】
[00107]  現在id_=456を有する２つのレコードがある。古いレコードのコピーは今ではバージョン３であり、そのため操作前と同様に４及び５にとって依然として認識可能である。新たなレコードはバージョン２であり、変更がバージョン２によって行われたので仮想クローン２によってしか認識することができない。次にユーザが（例えばプロセッサを使用して）仮想クローン４によってCarolを削除すると仮定されたい。その結果生じるデータベーステーブルは下記の通りである。
【０１０３】
【表７】
2021501931.tif 000009
【０１０４】
[00108]  この操作は元の(Carol,1)のレコードを削除し、次いでバージョン２及び５を有するレコードの２つのコピーを追加し、それは２及び５が４から１へのパス上のノードの子だがそれ自体はそのパス上にないからである。
【０１０５】
[00109]  要約すると、一部の例では仮想クローンＶによって行われる操作が以下のように実行される：
・レコードの削除：バージョンＮを有する元のレコードを削除するが、それ自体がパス上にない、仮想クローンＶから仮想クローンＮへのパス上にあるノードの子ごとに元のレコードのコピーを挿入する。
・レコードの追加：同じ祖先パスに関連する重複レコードを回避するために、追加しようとするレコードと共通の少なくとも１つの値（例えば仮想主キー）を含み、且つ同じ祖先パス内にある過去のレコードをまず削除し、次いでバージョンＶを有するレコードを追加することができる。
・レコードの追加（任意選択的な改変形態）：読み取りがその仮想主キーを有する如何なるレコードも返さないことをまず確実にし、かかるレコードを返す場合はエラーを返し、さもなければバージョンＶを有するレコードを追加する。
・レコードの修正：古いレコードを削除し、次いでそのレコードの修正済みのバージョンを追加する。
・クエリ、結合等：結合等の外部キーを伴う操作ではそれを通常通り行うが、仮想クローンＶによってアクセス可能であるように同じ祖先パス内にあるバージョン番号を有するレコードだけを２つのテーブルから結合する。
・テーブルの作成／削除：ユーザがテーブルの正当な名前（十分短く最後の文字が下線ではない）を選択することを確実にし、次いでテーブル名に下線を追加する。version__属性を追加する。
・属性の作成／削除：属性の名前が十分短く下線で終わらないことを確実にし、次いで下線を追加する。
【０１０６】
[00110]  データベーステーブルのクエリはバージョン番号を含む。一部の例では、仮想クローンを高速コピーするための（例えばプロセッサによって実行される）メソッドがある。一部の例では、仮想クローンを削除するための（例えばプロセッサによって実行される）メソッドもある。一部の実装形態では、ユーザは仮想クローンが葉である場合にのみその仮想クローンを削除することができる。仮想クローンを削除することが子を一切有さない内部仮想クローンを残す場合、その仮想クローンも削除することができる。かかる例では、葉ではない仮想クローンが葉になることはない。自らの子が削除されるや否や消滅するだけである。次第にかかる操作は、ルートから深いレベルまで進み、その後幾つかの分岐及び幾つかのノードしかない小さなツリーがある、単一の子の仮想クローンの連鎖のようにツリーを見せる場合がある。これらの単一の子の仮想クローンは貢献なしに空き容量及び時間を無駄にし得る。
【０１０７】
[00111]  一部の例では、そのような単一の子のバージョンをなくすために、システムが（例えばプロセッサによって実行される）圧縮操作を定期的に（又は散発的に）実行することができる。例えば仮想クローン４２が、仮想クローン９９である単一の子しか有さない場合、４２の各version__属性値を９９に変更する（例えばプロセッサによって実行される）操作をテーブルに対して行うことができ、ツリー内の２つの仮想クローンを含むシーケンス更新を行うことができ、結果はバージョン９９を有する単一の仮想クローンとして表される。
【０１０８】
[00112]  データベースは幾つかの仮想クローンによってアクセスされ得るが、例えば一度に１つの仮想クローンのクエリしか処理しない及び／又は圧縮操作中はクエリを処理しないと規定する単一の規則で全データベースを保護することが許容可能である。圧縮操作を（例えばプロセッサによって）行う前でさえ、ツリー内の長い連鎖を反映するようにクエリを最適化することができる。例えばクエリがバージョンＶ＝９９に対して行われ、且つバージョンＶ＝９９の祖先がバージョン｛１，１０，１２，２０，２３，３２，４２｝である場合、それらの７個のバージョンの何れかを有するレコードに自らを制限するようにクエリが（例えばプロセッサによって）修正され得る。しかし、２３未満の数字を有する他の頂点がツリー内にない場合、｛＜＝２３，３２，４２｝を尋ねるようにクエリを（例えばプロセッサによって）単純化することができる。換言すれば、そのクエリはバージョン４２、又はバージョン３２、又は２３以下の任意のバージョン番号を有するレコードを要求することになる。同様に、バージョンツリー内の適用可能な頂点が｛１，１０，１２，２０，２３，３２，４２｝だが、１０から３２の間の他の頂点がツリー内にない場合、クエリは｛１，１０．．．３２，４２｝のためのものであり得る。換言すれば、そのクエリは１に等しい、４２に等しい、又は１０から３２までの任意の数字に等しいバージョンと一致する。これらの最適化は、多くのバージョンが作成され削除されている場合に特に有用である。
【０１０９】
[00113]  完全なＳＱＬ言語は複雑であり、クエリしている仮想クローンによってアクセス可能なコマンド以上に、悪意あるユーザが情報にアクセスするために使用し得る多くの強力なコマンドがある。一部の実装形態では、完全なＳＱＬのうちの小さい部分集合だけがユーザによって使用可能であるようにし、その部分集合外の内容がユーザによって受信される場合はノードに例外を投げさせることでこの脆弱性を減らすことができる。例えば一部の例では、その名前がストリング操作によって構築されたテーブル又は属性へのクエリを許可しないようにシステムを構成することができ、それはユーザがかかるクエリを使用してpeople_又はversion__又はversions__に直接アクセスし得るからである。システムは実行時にコンパイルされるtransact-sqlステートメント等の動的ＳＱＬを許可しないことができる。一部の例ではこれらの制約が一時的であり得る。クエリがテーブル内の属性の名前又は全てのテーブルの名前を要求する場合、version_属性及びversions__テーブルを除去し、他のテーブル名から末尾の下線を除去するようにクエリを修正することができる。
【０１１０】
[00114]  上記の説明はテーブル及び属性が仮想クローン１において作成され、その後修正されないと仮定する。しかし、ユーザは高速コピー（本明細書では「仮想クローン」とも呼ぶ）の作成後に、異なるバージョンが異なるスキームを有するようにデータベースシステムのスキームを変更したい場合がある。一部の例では、（どちらも２本の下線を有する）tables__及びattributes__と名付けられた２つの新たなテーブルが（例えばプロセッサによって）定められ得る（且つメモリ内に記憶され得る）。tables__テーブルは、バージョン内のテーブル名を記録することができる。attributes__テーブルは、各バージョン内の各テーブル内の属性名を記録することができる。
【０１１１】
[00115]  一部の例では、何れか２つの仮想クローンが同じ名前Ｘを有するテーブルを有する場合、どちらもX_と名付けられる同じ物理テーブル内に記憶することができる。そのX_テーブルは、Ｘテーブルの何れかの中で現れる属性を含むことができる。それらの２つのＸテーブルが属性Ｙをそれぞれ含むが異なる種類のエントリを有する場合、X__テーブルは、attributes__テーブルによって対応するＹ属性にマップされる異なる名前を有する２つの異なる属性を含むことができる。
【０１１２】
[00116]  ２つの異なる仮想クローンに関連するＸと名付けられた２つの異なるテーブルが、自らの仮想主キーとして異なる属性（又は１組の属性）を有する場合、それらの２つのテーブルを別々に記憶することができ、tables__テーブルは別個のテーブルにどの名前が割り当てられたのかを記憶することができる。
【０１１３】
[00117]  一部の例では、システムが、単一の仮想クローンをシリアル化及び逆シリアル化するための、及び単一の仮想クローンのハッシュを得るための（例えばプロセッサによって実行される）メソッドを実施することができる。シリアル化は、その仮想クローンにとって可視であり及び／又は適用可能なテーブル及びデータを、その仮想クローンに関するスキーム及びデータを符号化するバイトのストリームへと変換することができる。逆シリアル化は、そのストリームを完全なデータベースへと戻すことができる。一部の実装形態では、シリアル化及び逆シリアル化の両方をユーザコードによってではなく（例えばプロセッサによって実行される）信頼できるコードによって行うことができる。一部の例では、逆シリアル化は仮想クローン１が作成された瞬間にしか行うことができない。通常、仮想クローン１はユーザコードにとって可視のテーブルを有さない空のデータベースである。仮想クローンを逆シリアル化することは、シリアル化の前に可視であったテーブル及びデータを再生成する。
【０１１４】
[00118]  一部の例では、データベースのハッシュは、何らかの正規順序で作成されていると仮定し、そのシリアル化ストリームのSHA2-384ハッシュであり得る。同様に述べると、データベースがＳＱＬクエリの特定のシーケンスによって作成される場合、どのコンピュータがそのクエリを実行しようともそのデータベースは同じハッシュを与える。そのため、例えばシステムはテーブルをその作成順にシリアル化し、テーブル内の属性をその作成順にシリアル化することができる。或いは、システムはテーブルをアルファベット順にシリアル化し、テーブル内のフィールドをアルファベット順にシリアル化することができる。他の実装形態では、各テーブル及び各レコードのハッシュをキャッシュに入れることによってこれを最適化することができる。
【０１１５】
高速コピー対スナップショット
[00119]  一部の実装形態では、データベース又はデータ構造を３つの異なるやり方で、つまり通常コピーを定め及び／又は作成することによって、又は「高速コピー」（仮想クローン）を定め及び／又は作成することによって、又は「スナップショット」を定め及び／又は作成することによってコピーすることができる。スナップショットは、変更不能であることによって通常コピー及び高速コピーと異なる。通常コピー及び高速コピーはどちらも変更可能だが、記憶される情報量の点で異なる。
【０１１６】
[00120]  図９では、最初に（（ａ）の一番左のツリー）データ１が「ビュー」Ｘによってアクセス可能である。ビューＸによってこのデータを読み取ることも書き込むこともできる。後に（（ｂ）において）スナップショットＹがＸから作成され、かかる作成はデータのコピー２を作成し、その後１が変更不能（灰色）になる。その後、Ｘによって２内のデータを修正し又は読み取ることができ、Ｙは１内のデータを読み取ることはできるがそのデータを修正することはできない。次に（ｃ）において、スナップショットＺがＸから作成され、かかる作成は変更可能コピー３を作成し、２が変更不能になる。これらのスナップショットは、２を１の完全なコピーにすることによって実装することができる。或いは、スナップショットは、スナップショットの作成後に生じる変更だけを２に含ませることによって実装することができる。何れにせよ、ビューＹ及びＺはデータの書き込みではなくデータの読み取りだけを可能にする。
【０１１７】
[00121]  スナップショットの挙動は通常コピーの挙動と異なる。通常コピーの挙動は図９に関して説明することができる。最初に図９の（ａ）において、データ１がビューＸによって読み取り又は修正可能である。後の（ｂ）で、ビューＹを作成し、１内のデータの２つのコピー２及び３も作成する通常コピーが行われる。この時点において１を削除することができる。その後、２はＸによって２にアクセスすることによって読み取り又は修正することができ、３はＹによって３にアクセスすることによって読み取り又は修正することができる。
【０１１８】
[00122]  この通常コピーの挙動は、図９に関して説明することができる以下のように高速コピーの挙動と異なる。最初の（ａ）において、データ１がビューＸによって読み取り又は修正可能である。後の（ｂ）で、ビュー（「高速コピー」とも呼ぶ）Ｙを作成する高速コピー操作が実行される。この高速コピー操作は、そのそれぞれが最初は空である２及び３を作成する。１内のデータは削除されないが変更不能になる。Ｘ又はＹによって読み取りが直ちに行われる場合、Ｘ又はＹは通過して１から読み取る。Ｘによって書き込みが行われる場合、２内に変更が記録され、１は変わらない。Ｙによって書き込みが行われる場合、３内に変更が記録され、１は変わらない。Ｘ上で読み取りが行われ、要求された情報が２内に記録されている変更の一部である場合、２からのその情報が返される。しかし、２がそのデータ片に対する如何なる変更も含まない場合、読み取りは１に通過する。同様に、Ｙによる読み取りはまず３を確認し、３内で応答が見つからない場合にのみ１へと続く。高速コピーの瞬間におけるデータは１として示し、変更不能なので灰色である。更にその後の（ｃ）では、ビューＸを高速コピーしてＺが得られ、この高速コピーは新たな４及び５をもたらし２を変更不能にする。最後にビューＹが削除される場合、その結果は図９の（ｄ）に示す通りである。図９の（ｄ）には３がない。３に到達可能なビューがもはや一切ないので削除されている。図９では、Ｘ、Ｙ、及びＺのそれぞれを「ビュー」と呼び、「高速コピー」とも呼ぶ。
【０１１９】
[00123]  一部の実装形態では、図９の（ｄ）に示すデータ構造に対してガベージコレクションの一種を最終的に行うことができる。１内のデータを取り、２内の変更を適用することによって１と２とをマージすることができる。次いで、そのマージデータで２を置換し、１を完全に削除することができる。このガベージコレクションは、Ｘ及びＺからの将来の読み取りの速度を高めることができる。Ｘからの読み取りは４、２、及び１を確認しなければならないのではなく、４及び最悪でも２を確認するだけでよいので、かかる読み取りはより高速であり得る。同様に、Ｚからの読み取りは５、２、及び１ではなく、５及び最悪でも２を確認するだけでよいのでより高速である。
【０１２０】
高速コピー可能マップ
[00124]  １組のキー値ペアをハッシュテーブル等の幾つかのやり方で実装することができる。かかるシステム（又はプロセッサ）は、キーに関連する値をＯ（１）時間で追加し、削除し、又は修正することができる。かかるシステム（又はプロセッサ）は、キー値ペアを１ペア当たりＯ（１）時間で未定義の順序で反復処理することもできる。各ペア内の値として空のストリングを有すること等により、かかるデータ構造は親子集合を実装することもできる。そのことは要素に関する親子関係を調べるためにＯ（１）時間与えるが、ＡＮＤ演算及び合併集合演算等の操作はそれよりも遅くなる。
【０１２１】
[00125]  高速コピー可能マップは幾つかのやり方で実装することができる。（一例として図９を使用する）１つのやり方は、円（又は仮想クローン）ごとにオブジェクトを作成することであって、各オブジェクトは例えばJava HashMapを含む、作成すること、及びビューを表す正方形ごとにオブジェクトを作成することである。最初に、Ｘによる読み書きは１内の基礎を成すマップまで直接通過する。
【０１２２】
[00126]  Ｙの高速コピーを作成した後、空のマップ２及び３を作成し、１を変更不能として印付けする。キー値ペアがＸに書き込まれると、かかる書き込みは２への書き込みをもたらす。Ｘへの読み取りは、最初は２への読み取りをもたらす。キーが２内で見つからない場合、１への読み取りを行う。同様に、Ｚを高速コピーした後、Ｚへの読み取りは５への読み取りをもたらす。それが失敗した場合は２を読み取る。それが失敗した場合は１を読み取る。そのため、所与の正方形への書き込みは隣接する円の変更を引き起こし、キーが見つかるまで又はルートがクエリされるまで読み取りがツリーを上がって行く。図９（ｂ）では、Ｘへの書き込み操作が所与のキー値ペアを削除する場合、プロセッサはキー値ペアが存在しないことを表す特殊値である「値」と共にそのキーを１から２内にコピーすることができる。従って、そのキー値ペアを求める将来のＸへの読み取りは、１へと続いてそのキーに関する元の値を返すのではなく、２で止まってそのキーに関する値がないと報告する。
【０１２３】
[00127]  Ｚ内のペアに対する反復は、１内のペア、次いで２内のペア、次いで５内のペアを反復することによって行うことができる。例えば１内のキー値ペアは、自らのキーが２内にも５内にもないことをクエリが示す場合にのみ使用される。同様に、例えば２内のキー値ペアは、自らのキーが５内にないことをクエリが示す場合にのみ使用される。例えば５内のキー値ペアは他の任意のマップを調べることなしに使用され、それは５が円のツリーの葉だからである。
【０１２４】
[00128]  基礎を成すマップが任意の順序で反復する場合、この手法も任意の順序で反復を行う。基礎を成すマップが、キー値ペアが最後に修正された順序でキー値ペアを反復する場合、この手法は同じことを行う。どちらの場合にも、要素ごとの時間は決まった深度のツリーではＯ（１）であり、又はツリーがｄレベル深い場合はＯ（ｌｏｇ  ｄ）である。
【０１２５】
[00129]  アルファベット順にキーをソートすることによって等、基礎を成すマップが他の何らかの順序で反復する場合、この手法は自動で同じことは行わない。代わりにシステムは、キーをまずバッファにコピーし、次いでそれらをソートし、そのバッファを反復処理することができる。これは高価な操作であり、ｎ個のアイテムに関して要素ごとの償却時間をＯ（１）からＯ（ｌｏｇ  ｎ）に増やす。一部の応用では、かかる増加が依然として許容可能であり得る。
【０１２６】
[00130]  更なる最適化が実行時に可能である。例えば図９（ｃ）では、２と１とをマージする新たなマップで２内のマップを置換することができる。すると新たな２が自らのツリーのルートになり、１がその子を失う。１が子を一切有さない場合、１を削除することができる。同様に図９（ｃ）で、５は１、２、及び５のマージで置換し、自らのルートになることができる。１及び２等の２つの変更不能なテーブルをマージするには幾らかの時間がかかり得るが、それはバックグラウンドスレッド内で行うことができる。加えて、それが完了すると、マージ済みのマップを古いマップと交換することができ、その結果生じるツリーはより浅くなり、読み取り及び反復の速度を高める。
【０１２７】
[00131]  加えてビューが削除される場合、円の一部はアクセス不能になり、メモリから削除することができ、それらをマージすることに関する如何なる作業も中止することができる。このことはシステムが図９（ｄ）を反映することを可能にする。これは基礎を成す言語におけるガベージコレクションプロセスによって引き起こされ得る。或いは、システムはビューを明確に削除するための方法を実施し、その時点で円が削除されるときで、ある円に親がないときを明らかにするために参照カウントを保つことができる。
【０１２８】
[00132]  キー値ペアの削除は、キー値ペアを実際に削除することによってルートマップ内で実施することができる。ルート以外のマップでは、かかる削除は値を専用の「削除済み」オブジェクトに変更することによって行われ得る。マップをマージすることが新たなマップをルートにする場合、そのキー値ペアの反復処理を行って「削除済み」オブジェクトを有するキー値ペアを除去することができる。
【０１２９】
[00133]  別の手法は、ハッシュテーブルのツリーを有する代わりにトライ等の単一データ構造を使用することである。トライでは、各キーが例えば１６ビット、３２ビット、又は６４ビット等の既定のサイズの固定長ハッシュであり得る。マップは、そのｎ番目のレベルがキーのｎ番目のビットを表す二分木によって表され、キーは１６（又は３２又は６４）レベルを降りて行くことによって探索される。次いで一番下のレベルの葉において値が記憶される。キーハッシュ衝突を処理するために葉はキー値ペアのリストを記憶するが、とりわけ過度な衝突を引き起こすためにキーを選択しようと試み得る攻撃者にハッシュ関数が知られていない場合、そのリストは平均して非常に短いことが期待される。二分木ではなくｎ分木を使用することにより、速度及びメモリ要件の両方を改善することもできる。例えば３２＝２５なので、３２分木は５分の１のレベルしか有さない。
【０１３０】
[00134]  上記の内容は標準的なトライについて説明した。標準的なトライを高速コピー可能トライに変換するために、どのデータバージョンが適用されるのかに関する情報を用いてツリー内の各エッジをラベル付けすることができる。そのため図９（ａ）では、所与のキー値ペアを追加することができ、そのエッジを１で印付けすることができる。次いでＹ及びＺを高速コピーした後、キー値ペアをＺに追加することができる。かかる追加は、それぞれ５で印付けすることができる更に多くのエッジをツリーに追加することを含み得る。ビューＺからキーが読み取られる場合、システムはルートから開始し、１、２、又は５で印付けされているエッジだけだがキーのビットと一致するエッジをたどることができる。当然ながら、これは図９（ｃ）のグラフがメモリ内に明確に記憶されること、又は図９（ｃ）のグラフのルートまでの自らのパスが１、２、及び５で印付けされている円を通過することを少なくともＺが（例えばＺとの関連付けを記憶することによって）識別できることを意味する。
【０１３１】
[00135]  より多くの高速コピーが作成されるにつれ、エッジに対する条件付きの確認がより複雑になり得る。例えばクエリは、｛１，２，５，１７，３２，６５，８２，９７，９９｝の数字のうちの１つで印付けされているエッジだけをたどってトライを徐々に降りて行くことができる。しかし一部の応用では、図９のグラフがルートから底付近まで細長い連鎖へと長期的に発展し、底付近で多くの分岐を広げることが予期される場合がある。円内の数字が（図の場合と同様に）番号順に割り当てられる場合、エッジが長いリスト｛１，２，５，１７，３２，６５，８２，９７，９９｝内の任意の数字で印付けされているかどうかを確認するのではなく、数字が｛＜８０，８２，９７，９９｝のリスト内にあることを確認できる可能性があり、この「＜８０」のエントリは８０未満の任意の数と一致する。換言すれば、たとえ図９のツリーが経時的に高く伸びても、そのツリーが一番下に小さいツリーを有する連鎖である限り、ブール条件の複雑さが経時的に増大する必要はない。上記で説明したように、キー値ペアを削除するには専用の「削除済み」オブジェクトを使用することができる。又はかかる削除は、特定のバージョンにおいて削除されているものとしてエッジを印付けすることによって行うことができる。次いでバージョンは、そのバージョンについて削除されたものとしてトライ内の一部のエッジを印付けするキーを削除することができる。その場合図９（ｃ）では、或るエッジについて言及される｛１，２，５｝の最大数が、エッジが削除されたのではなく追加されたことを示す場合、そのエッジはビューＺのトライ内にあると見なされる。
【０１３２】
高速コピー可能アレイ
[00136]  高速コピー可能マップが作成されると、他のデータ構造の高速コピー可能バージョンが作成され得る。例えば高速コピー可能アレイは、実アレイを前の節で説明した高速コピー可能マップ等の高速コピー可能マップと組み合わせることによって構築することができる。最初に、仮想クローン又はビューが１つしかない場合、読み取り及び書き込みがアレイに直接行く。高速コピー後、書き込みはマップに行き、各キー値ペアはキーとしてアレイインデックスを使用し、値としてアレイ要素を使用する。読み取りはマップを最初に確認し、インデックスが見つからない場合はアレイから読み取る。複数の高速コピー操作がマップのツリーをもたらし得る。或る仮想クローン又はビューからの読み取りは、そのキーを有するマップを見つけるまで又は実アレイであるツリーのルートに到達するまでツリーを上がって行く。
【０１３３】
[00137]  前と同様に、バージョンツリーを時々圧縮することができる。例えば図９（ｃ）では、１、２、及び５を反映する新たなアレイを作成することができる。新たなアレイが作成されると、空のマップに関連するその新たなアレイにビューＺが接続し得る。かかる圧縮の後、ツリーを再び成長させる更なる高速コピーがあるまで読み取り及び書き込みが両方ともより高速になる。このプロセスは繰り返す／反復することができる。同じ手法がアレイだけでなくほぼ全ての集合に適用される。高速コピー可能マップを含むオブジェクト内に任意の集合が包まれ、読み取り及び書き込みは集合を確認する前にマップを確認する。読み取り及び書き込みは、複数の高速コピー操作がバージョンツリーを成長させると遅くなり、ツリーが圧縮されると速くなる。
【０１３４】
高速コピー可能ファイルシステム
[00138]  高速コピー可能ファイルシステムでは、仮想クローン又はビューオブジェクトが全ファイルシステムを表すことができる。仮想クローン又はビューオブジェクトは、ユーザにとってはファイルを含むディレクトリのツリーを含む別個のハードドライブのように見える。高速コピー操作は、ユーザにとってはオリジナルの正確なコピーを有する新たなハードドライブを作成することのように見える。そのため、両方のドライブを独立に修正することができ、何れへの変更も他方に影響を及ぼさない。これは、全てのバージョンからのファイルを含む１つの実ディレクトリを有することによって実施され得る。本明細書に記載の高速コピー可能データベースは、各バージョンのディレクトリツリー及び各ディレクトリ内のファイルへのポインタを記憶する。２つのバージョンがどちらも同一ファイルを含む場合、システムは現実のハードドライブ上で１つの実コピーしか必要でなく、データベースは実コピーへの２つのポインタを記憶することができる。ファイルを認識可能な最後のビューからファイルを削除することによってファイルへの最後のポインタが削除されると、システムは物理ハードドライブ上の物理ファイルを削除する。この手法はコピーをＯ（１）操作にする。この手法は、重複ファイルの単一コピーだけを記憶することによってハードドライブの空き容量も節約する。
【０１３５】
[00139]  システムは、例えば２ＫＢチャンク等の小さなチャンクへとファイルを区分化することによって更に最適化することができる。次いでデータベースは、ファイルを構成するチャンクを指すポインタのリストをファイルごとに記憶する。このようにして、２つのファイルが最初の２ＫＢについて同じコンテンツを有する場合、そのチャンクの一方のコピーだけを物理的に記憶し、それにより空き容量を更に節約する。このようにして、２つの仮想クローン又はビューが同じファイルにアクセスできる場合だけでなく、単一の仮想クローン又はビューが２つの異なるディレクトリ内で同一のファイルを有するディレクトリツリーを表す場合にも重複が減らされる。
【０１３６】
[00140]  ファイル又は全ディレクトリサブツリーのハッシュを素早く計算する必要がある場合、その情報をデータベース内に記憶することもできる。各チャンクのハッシュを記憶し、チャンクの修正時に修正することができる。実際に一部の例では、１６進数のファイルのハッシュであるように、基礎を成すファイルシステム内のチャンクのファイル名を定めることができる。所与のチャンクＸに対して１つのポインタしか存在しない場合、チャンクを修正することはファイル名を変更することを含み得る。所与のチャンクＹに対して複数のポインタがある場合、チャンクのコピーを作成し、コピーを修正し、コピーをそのハッシュで再命名することによってチャンクＹの修正を実施することができる。
【０１３７】
[00141]  かかる例では、ファイルのチャンクの連結のハッシュ等、ファイルのハッシュがインクリメンタルハッシュであり得る。或いはファイルのハッシュは、ファイル内のチャンクに関する（位置，データ）ペアのハッシュの和として定めることができる。ディレクトリのハッシュは、ディレクトリ内のファイルのハッシュの和とすることができる。ファイルが変更されると、データベースは影響を受けたハッシュを例えばバックグラウンドスレッド内で更新することができる。或いは、メソッドへの呼び出しがハッシュを要求するまでハッシュを計算しなくてもよい。かかる例では、ハッシュを要求に応じて計算することができる。このアーキテクチャは、従来のファイルシステムには通常存在しない追加機能の実装を促進する。ファイルシステムの「トランザクション」は、データベースの意味において実施することができる。システムが（例えばプロセッサによって）ファイルシステムメソッドを呼び出してファイルシステムを操作する場合、システムはトランザクションを開始するための（例えばプロセッサによって実行される）メソッドを呼び出し、次いでファイルを追加し、除去し、又は修正するために複数の呼び出しを行い、次いでトランザクションをコミットするために（例えばプロセッサによって実行される）メソッドを呼び出すことができる。かかる一部の実装形態では、システムの電源が任意の時点において切られても、ファイルシステムはそれらの操作の全てを反映する又はどれも反映しないことになる。システムを遅くするやり方で従来のデータベースを呼び出すことを伴うので、この能力は従来のファイルシステムには概して追加されていない。しかし本明細書に記載の高速コピー可能ファイルシステムはその計算コストを他の理由で既に払っており、そのためトランザクションを追加することは実際には僅かな追加／増分コストしかない。
【０１３８】
[00142]  一部の実装形態では、ファイルシステムレベルでの「トランザクション」をデータベースレベルでの「トランザクション」として実施することができる。操作の途中でクラッシュがある場合、（例えばプロセッサによって実行される）データベース回復方法が、データベーストランザクションの始まりまでデータベースをロールバックすることを含み得る。次いでデータベース回復方法は、何れかがデータベースによってもはや参照されていないかどうかを確認するために記憶済みのチャンクのパススルーを行い、識別したそのような任意のチャンクを削除することができる。このことは正しい状態の素早い回復と、その後に続く無駄な空間を回復するための（例えばバックグラウンドスレッド内の）長いプロセスを促進する。この手法では、データベースにコミットが送信され、データベースが更新される後までチャンクファイルが削除されない。
【０１３９】
[00143]  以下の内容は、（例えばJavaからアクセスされる）高速コピー可能ファイルシステム用のシステムの詳細な解説を含む。（例えばJavaで書かれプロセッサによって実行される）ユーザプログラムが、共通のファイルシステム操作と幾つかの非共通操作とをサポートする（例えば同じくJavaで書かれプロセッサによって実行される）高速コピー可能ファイルシステムプラットフォームのメソッドを呼び出す。
【０１４０】
[00144]  高速コピー可能ファイルシステムは、（プロセッサによって実行される）ユーザコード及び／又はプロセスが、ボリューム、ディレクトリ、及びファイルのように見えるものにアクセスすることを可能にし得る。知られているファイルシステムと異なり、本明細書に記載の高速コピー可能ファイルシステムは以下を促進することができる：
−ファイル、ディレクトリツリー、又はボリュームの高速コピー
−ファイル、ディレクトリツリー、又はボリュームのハッシュの高速計算
−ファイル、ディレクトリツリー、又はボリュームのシリアル化及び逆シリアル化
−（差分コピーに関する）それらのものの部分集合のシリアル化及び逆シリアル化
−書き込み速度よりも読み取り速度を重要視すること
−冗長なディレクトリ、ファイル、及びファイルの一部の自動重複排除
−そのハッシュだけを所与としてファイル又はディレクトリを見つける能力（即ちハッシュはポインタである）
−ファイルシステムのためのメタデータのデータベースに対する読み取り専用ＳＱＬクエリ
【０１４１】
[00145]  一部の実装形態ではファイルシステムが以下を実装する：
ボリューム−自らのルートディレクトリを有する／としての仮想ハードドライブ
ディレクトリ−幾らかのメタデータと、０以上（＜２６３）のファイル及びディレクトリのソートされたリスト
ファイル−幾らかのメタデータと、０以上（＜２６３）のバイトのシーケンス
ＡＣＬ（アクセス制御リスト）−識別情報のグループを含むファイル又はディレクトリ
識別情報−ファイルシステムにアクセスし得る者を表す（ＡＣＬ内に記憶される）公開鍵
エンティティ−ファイル又はディレクトリ（ＡＣＬでもＡＣＬでなくてもよい）
チャンク−０からCHUNK_SIZEバイトまでのシーケンス（Javaファイルとして物理的に記憶される）
チャンクツリー−１つのエンティティを表すためにツリー状に構成される１組の１つ以上のチャンク
CHUNK_SIZE＝４０９６（又は異なる定数）
メタデータ−その名前、（複数のやり方で計算される）サイズ、アクセス許可、ユーザ定義メタデータ等を含む、１つのエンティティに関する情報
許可−エンティティは全員のためのREAD許可を有するか、又はREAD許可を有する者の指定のＡＣＬグループを有する。WRITEについても同様である。
【０１４２】
[00146]  一部の実装形態ではファイルシステムが以下を実装しない：
リンク−このファイルシステムはリンク、ハードリンク、ソフトリンク、シンボリックリンク、エイリアス等を有さない。しかし高速クローニングは同様のものを可能にし、ディレクトリ内のライブラリにリンクを張るのではなく、単純に自分のディレクトリに全ライブラリをコピーすることができ、そうすることはリンクを使用した場合と同じ位少ない記憶域を使用する。
ディレクトリ  .and..−データ構造は.or..ディレクトリの存在を反映しない。しかし、「/here/../there」等、インタフェースはそれらを含むユーザからのパスストリングを正しく解釈することができる。
圧縮／暗号化されたディレクトリ−Windows又はOSXのように圧縮され又は暗号化されたディレクトリの等価物はない。しかし、より弱い形の圧縮（チャンクの重複排除）が広く実施される。更に、ディレクトリツリーが自らのファイル及びサブディレクトリのそれぞれについてreadAclフラグを真に設定されている場合、データ、ファイル名、及びディレクトリ名が暗号化されるが、ディレクトリツリーのトポロジ及びファイルサイズは依然として可視である。
Rsync及びTime Machine−一部の例では、ファイルシステムに対して差分コピー及び／又は差分バックアップを実施することができる。
Unix型の許可−高速コピー可能ファイルシステムの性質により、ファイル又はディレクトリに関する固有の概念、所有者、グループ、又はユーザがない。読み取り操作、書き込み操作、及び実行操作のうち、最初の２つだけが有意味である。従って高速コピー可能ファイルシステムは、各ファイル又はフォルダにREAD用の任意選択的なアクセス制御リスト（ＡＣＬ）及びWRITE用の別のＡＣＬを与えることができる。ユーザのアプリケーションがそれ以上のものを要求する場合、ユーザはそれをユーザメタデータの一部として追加することができる。更に、本明細書でのREAD及びWRITEの厳密な定義はUnix及び他のシステムの定義と僅かに異なる。
【０１４３】
[00147]  ユーザにとってファイルシステムは次のように機能するように見える：ボリュームは、ルートディレクトリを有する／としての外部のハードドライブのようなものである。ボリュームはディレクトリツリーを含む。各ディレクトリは１組のディレクトリ及びファイルを含む。２つのディレクトリ及び／又は何らかの等価物は含まない（但し一部の例ではユーザインタフェースがその存在をシミュレートし得る）。一部の例では、ユーザはハードリンク、ソフトリンク、シンボリックリンク、エイリアス等を作成すること又は認めることができない。可視ディレクトリツリーは（ユーザにとって）ＤＡＧ又は循環グラフではなくツリーのように見える。ユーザは高速コピー可能ファイルシステムを通常のファイルシステムだが、書き込みが通常よりも遅く、以下の操作が通常よりも速いファイルシステムとして認める：
−ファイル、ディレクトリ、又はボリュームを高速コピーすること
−ファイル又は全ディレクトリツリーのハッシュを得ること
−ファイル、ディレクトリ、又は全ディレクトリツリーのバイト単位のサイズを得ること
−ファイル又はディレクトリツリーをストリーム（例えばJavaストリーム）にシリアル化／逆シリアル化すること
−１組のチャンクをストリーム（例えばJavaストリーム）にシリアル化／逆シリアル化すること
−差分コピーを定めるのを簡単にする情報を得ること（rsync等）
−所与のボリューム内のファイルに関するメタデータのデータベースに対する読み取り専用ＳＱＬクエリ
【０１４４】
[00148]  システムは（例えばプロセッサを使用して）ファイル及びディレクトリの高速クローニングを行い、ファイル又はディレクトリのハッシュを素早く取得し、ファイル及びディレクトリツリーをシリアル化／逆シリアル化することができる。一部の例では、高速コピー可能ファイルシステムプラットフォームに分散ハッシュテーブル（ＤＨＴ）が追加され、ユーザはファイル又はディレクトリツリーをそのハッシュを所与としてインターネットから見つけダウンロードすることができる。かかる例では、ダウンロードはユーザがまだ有していないデータだけを転送する効率的なものであり得る。
【０１４５】
[00149]  ユーザは、ボリュームのコンテンツをディレクトリの（ＤＡＧ、循環グラフ、又は無限ツリーとしてではなく）有限ツリーとして認める。それらのディレクトリのそれぞれがファイル及び他のディレクトリを含み得る。ファイル及びディレクトリの一部はＡＣＬであるものとして印付けすることができ、通常は隠されているが、要求時にユーザによって見られ得る。
【０１４６】
[00150]  一部の例では、アクセス許可モデルがREAD及びWRITEを含むがEXECUTEは含まず、ＩＤの階層的なＡＣＬグループに基づいて構築される。ユーザは、ファイル又はフォルダのreadAllが真の場合又はそのreadAllが偽でありreadAclがそのユーザを含む場合、そのファイル又はフォルダのREAD許可を有する。WRITE許可も（writeAll及びwriteAclを用いて）同様に定められる。
【０１４７】
[00151]  以下の表では、行の始めに挙げた許可をユーザが有する場合、そのユーザはその列に関して挙げた内容に対して色付けされた操作を行うことを許可されている（赤色＝権利なし、黄色＝読み取りの権利だけ、緑色＝読み取り及び修正の権利）。最初の４列はメタデータ用である。
【０１４８】
【表８】
2021501931.tif 000010
【０１４９】
読み取り＝ユーザはデータを読み取ることができる。
読み取りの欠如＝ユーザはデータの暗号化バージョンだけを読み取ることができ、又はファイル若しくはディレクトリを別の位置にコピーすることができ、又はデータをシリアル化／逆シリアル化することができる。
修正＝ユーザはデータの任意の部分を変更することができる。ディレクトリでは、ディレクトリ自体の名前を変更すること及びそのディレクトリ内でファイル／ディレクトリを追加／削除することを含むが、そのディレクトリ内のそれらのもののファイル名を読み取ること又は修正することは必ずしも許可しない。
【０１５０】
一部の例では、ユーザはファイル又はディレクトリツリーをその許可に関係なくコピーし、シリアル化し、又は逆シリアル化することができる。ユーザがそれを行う時点において、ユーザはファイル又はディレクトリツリー内の全てのものについて書き込み許可を任意選択的に設定する（即ちそのそれぞれについてwriteAll及びwriteAclを設定する）ことができる。
【０１５１】
[00152]  「エンティティ」は、ファイル又はディレクトリであり得る。各エンティティは独自のメタデータ及びコンテンツを有する。ファイルの「コンテンツ」は、そのファイル内のバイトシーケンスだと定められる。ディレクトリのコンテンツは、そのディレクトリ内のファイル及びディレクトリのハッシュのソートされたシーケンスだと定められる。一部の例では、以下で定めるように各エンティティがチャンクで作られるチャンクツリー内に物理的に記憶される。
【０１５２】
[00153]  「チャンク」は、（例えばJavaによって提供される）基礎を成すファイルシステム内に単一のファイルとして物理的に記憶されるバイトのシーケンスである。高速コピー可能ファイルシステム内のディレクトリ及びファイル及びＡＣＬは仮想的とすることができる。かかる実装形態では、チャンクだけがユーザのハードドライブ上に物理的に存在する。ユーザはそれらのチャンクを見ないが、基礎を成す物理ファイルシステムがチャンクを操作し及び／又は使用する。
【０１５３】
[00154]  チャンクは、（例えばJavaによって提供される）ハードドライブの物理ファイルシステム内でファイル名を有する。一部の例ではそのファイル名は、小文字の１６進数でのそのコンテンツの２５６ビットハッシュであり得る。従ってディスクメモリにチャンクが書き込まれると、チャンクは修正されないが削除され得る。一部の例では、チャンクはメモリ内の（例えばJavaによって提供される）物理ファイルシステム内の単一のディレクトリ内に記憶され得る。他の例では、サブディレクトリを含むディレクトリであって、チャンクがそのファイル名の最初の数文字に従って分けられる、ディレクトリを使用してメモリ内にチャンクを記憶することができる。
【０１５４】
[00155]  一部の例では、チャンクがCHUNK_SIZEバイトよりも大きくない。この全体的制約は、例えば４＊１０２４であるように定めることができる。他の例では、CHUNK_SIZEは、OSXスパースバンドルによって使用される４＊１０２４から８＊１０２４＊１０２４の間である。
【０１５５】
[00156]  単一のエンティティ（ファイル又はディレクトリ）を記憶するために使用される「チャンクツリー」を形成するために、１つ又は複数のチャンクを組み合わせることができる。最初のチャンクは、ツリーの深度を与える「深度」バイトで始まる。そのため0x01はツリーがルート及び葉の両方である単一のチャンクに過ぎないことを意味し、0x02はルートの子が全て葉であること等を意味する。深度バイトの後、以下のメタデータの節で定めるエンティティのための「固定」メタデータ要素が続く。
【０１５６】
[00157]  十分小さいエンティティでは、この後に残りのメタデータが続き、その後にファイル又はディレクトリのコンテンツが続く（ディレクトリの「コンテンツ」はディレクトリ内の各ファイル及びサブディレクトリの３２バイトハッシュのソートされたリストである）。一例として、記憶されるデータが最大でCHUNK_SIZEバイトである場合、そのデータは単一のチャンク内に入り、そのチャンクは１（0x01）の深度を有し、そのエンティティに関する全チャンクツリーを含む。
【０１５７】
[00158]  エンティティが１つのチャンクに入るには大き過ぎる場合、固定メタデータの後に子のチャンクのハッシュのシーケンスが続く。ツリー内の内部チャンクに関して、子のチャンクのそれぞれは自らの子のチャンクのハッシュのシーケンスを含み、その後も同様に続く。
【０１５８】
[00159]  幅優先順にアクセスされる場合、葉チャンクは残りのメタデータ、次いでファイル又はディレクトリのコンテンツを含む。一部の例では、コンテンツの始まりがメタデータの終わりと別個の葉チャンク内にある。
【０１５９】
[00160]  一部の例では、ツリートポロジが以下のように一意に定められる。ツリーが単一のチャンク内に入ることができる場合、そのツリーは単一のチャンク内に入れられる。さもなければシステムは、ノードが幅優先順にアクセスされる場合、単一の葉ノードがメタデータ及びコンテンツの両方からのバイトを含むことができない制約を受けて先のノードが可能な限り大きいようにツリーを定めることができる。
【０１６０】
[00161]  一部の例では、各エンティティ（ファイル又はディレクトリ）が以下のメタデータを以下の順序でここでは便宜上３つのカテゴリ（固定、可変、センシティブ）に分けて含み得る。
【０１６１】
固定：
１．filesystem−２バイト−最後に修正されたときのファイルシステムのバージョン
２．entity type−１バイト
0x00=ENTITY_FILE=ファイル
0x01=ENTITY_DIR=ディレクトリ
0x80=ACL_FILE=ＡＣＬグループを表すファイル
0x81=ACL_DIR=ＡＣＬグループを表すディレクトリ
３．size−８バイト−チャンクのデデュープが一切ない場合のこのファイル又は単一のディレクトリ内のバイト数
４．sizeSMetadata−８バイト−センシティブメタデータのバイト数
５．sizeVMetadata−８バイト−可変メタデータのバイト数
６．sizeTree−８バイト−ディレクトリについてのみ存在する。デデュープが一切ない場合のこのディレクトリツリー内のファイル及びディレクトリの合計サイズ
７．readALL−１バイト−このファイル又はディレクトリに対するREAD許可を全員が有する場合は真（0x01）である。さもなければ、かかる許可をＡＣＬに限定するために偽（0x00）である。
８．writeALL−１バイト−このファイル又はディレクトリに対するWRITE許可を全員が有する場合は真（0x01）である。さもなければ、かかる許可をＡＣＬに限定するために偽（0x00）である。
【０１６２】
センシティブ：
９．name−ファイル名又はディレクトリ名は、String.length()<=255を有する非空のストリング（例えばJavaストリング）である。同様に述べると、最大で２５５のUTF-16コード単位。一部の例では、スラッシュ及びコロンを含む全てのユニコード文字が許可される。一部の例ではパス長の制限がない。
１０．userMetadata−キー値ペアのリストであり、キー及び値がどちらもストリングであり（例えば任意の正当なJava Stringでもよく）、同じキーについて複数のペアが存在し得る。ユーザがペアを追加するためにメソッドを呼び出さない限りこれは空である。
【０１６３】
可変：
１１．readAcl−３２バイト−readAllが偽の場合に存在する−READ許可を有するＩＤのＡＣＬグループを表すＡＣＬファイル又はＡＣＬディレクトリツリーのハッシュ。システムはディレクトリのreadAclが、ディレクトリ内に記憶されているＡＣＬファイル又はＡＣＬディレクトリのハッシュであることを確実にすることができる。ファイルのreadAclは、ファイルと同じディレクトリ内に記憶されているＡＣＬファイル又はＡＣＬディレクトリのハッシュであり得る。
１２．writeAclHash−３２バイト−writeAllが偽の場合に存在する−readAclと同様だが、ことによると異なるエンティティを指すハッシュ。
１３．encryptedKeys−readAllが偽の場合に存在する。ＡＣＬグループ内の公開鍵当たり１つの暗号化キーのリスト。ＡＣＬグループ内のＩＤのソートされたリストに対応する順序で、このリストは８バイト数と、その後に続く暗号化キーのそれぞれとして記憶される。
【０１６４】
[00162]  一部の例では、記憶される４種類のサイズに加えて、記憶されないが必要に応じて（例えばプロセッサによって）再計算される５番目の種類がある。それが「デデュープサイズ」であり、デデュープサイズはこのファイル又はディレクトリツリー内の固有のチャンクの合計サイズである。これは、ファイル又はディレクトリツリーの外側のチャンクを無視しながらこのファイル又はディレクトリツリー内でデデュープが行われる場合のディスクメモリ上のサイズである。
【０１６５】
[00163]  一部の例では、そのreadAllが偽であるエンティティを（例えばプロセッサを使用して）部分的に暗号化することができる。「センシティブ」メタデータは暗号化されるが、「固定」及び「可変」メタデータは暗号化されない。ファイルのコンテンツは暗号化されるが、ディレクトリのコンテンツは暗号化されない。
【０１６６】
[00164]  一部の例では、暗号化はランダムキーを用いるＸＴＳ（NIST SP800-38E）であり得る。ＸＴＳの「データユニット」は、センシティブメタデータ及び可変メタデータの両方を含み、データユニットがセンシティブ部分だけである任意のチャンクを除き、それぞれのチャンク全体である。センシティブメタデータの暗号化はランダムキーを用いたＸＴＳ暗号化であり得る。ファイルのコンテンツの暗号化は、そのビットが反転された同じキーを使用する別個のＸＴＳ暗号化であり得る。従って、センシティブメタデータがその長さを拡張することによって修正される場合、メタデータの一部を再暗号化することができるがコンテンツは再暗号化されず、それはコンテンツが新たなチャンクの冒頭から始まるからである。
【０１６７】
[00165]  次いで、ＡＣＬグループからの公開鍵のソートされたリスト内の公開鍵のそれぞれと共に（例えばプロセッサを使用して）ランダムキーを暗号化することができ、その結果がencryptedKeysとして記憶される。ＡＣＬファイルでは、ＡＣＬグループはＡＣＬファイル内のＩＤのソートされたリストである。ＡＣＬディレクトリでは、ＡＣＬグループは、ルートがそのディレクトリであるディレクトリツリー内のＡＣＬファイル内のＩＤのソートされたリストである。
【０１６８】
[00166]  一部の例では、ＩＤを追加することによってＡＣＬ  ＩＤグループが変化する場合、暗号化キーのリストに新たな暗号化キーを追加することができる。ＩＤが削除される場合、新たなランダムキーが選択され、暗号化キーのリストが再計算され、センシティブメタデータ及びコンテンツの両方が古いキーで復号され、新たなキーで再暗号化される。例えばＡＣＬへの幾つかの変更を続けざまに行えるようにし、変更に関して再暗号化を一度行うことにより、書き込みキャッシュを使用してこのプロセスを最適化することができる。
【０１６９】
[00167]  ユーザメタデータは、（キー，値）ペアのソートされたリストであり得る。各キーはストリング（例えばJava String）であり、各キーは一意である。各値はJava List<byte[]>とすることができ、リスト内の順序は様々な値がユーザによって追加された順序である。ユーザは値を追加及び削除することができる。値が残っていない場合はペアが削除される。
【０１７０】
[00168]  これらのキーは、ユーザが望む任意のストリングであり得る。一部の実装形態では空のストリングが許容可能だが、ヌルは許容されない。例は「creatorApp」又は「openWith」又は「source」を含み、値はディレクトリツリーのハッシュである（最初の２つの事例は最上位のディレクトリ内に単一の実行可能ファイルを含む）。他の例は小さいjpgに関連する「thumbnail」、又は日時に関連する「createdDate」若しくは「modifiedDate」、又はこのファイルが存在し続けることを望む各ユーザのＩＤに関連する「pinned」を含む。高速コピー可能ファイルシステムプラットフォームは、ユーザがどのようなキーを提供するのかにもよるが、これらの一部又は全てを使用することができる。
【０１７１】
[00169]  一部の実装形態では、sizeフィールドは、そのエンティティのためのチャンクツリー内の全てのチャンクのバイト単位の合計サイズを与える符号付きの６４ビット整数であり得る。チャンクツリー内で同じチャンクが２度現れる場合、そのチャンクは２回カウントされる。従ってsizeフィールドは、デデュープがない場合にエンティティのチャンクツリーが占めることになる物理ディスクメモリ空間の量である。
【０１７２】
[00170]  treeSizeフィールドはディレクトリについて存在するが、ファイル又はＡＣＬについては存在しない。treeSizeフィールドは、このディレクトリのサイズと、このディレクトリ内の各ファイルのサイズと、このディレクトリ内の各サブディレクトリのtreeSizeとの和であり得る。これは、デデュープがない場合にこのディレクトリツリーがメモリ内で占めることになる空き容量である。
【０１７３】
[00171]  一部の例では、高速コピー可能ファイルシステムプラットフォームは各ユーザが何バイトの責任を負うのかを追跡することもできる。ファイルでは、そのファイルをpinするユーザには「size」バイトが課され得る。ディレクトリでは、そのディレクトリをpinするユーザには「treeSize」バイトが課され得る。誰もファイルをpinしていない場合、アプリケーションはメモリ空間を節約するためにそのファイルを削除することに決めることができる。pinされているファイル又はディレクトリをディレクトリツリーが含まない場合、メモリ空間を節約するためにその全ディレクトリツリーを（例えばプロセッサを使用して）削除することができる。これはつまり、２人のユーザが同じものをpinする場合に生じるデデュープは無視し、ユーザは自身が使用を引き起こしている空間に関して課されることを意味する。高速コピー可能ファイルシステムプラットフォームは、そのディレクトリツリー内のディレクトリ及びエンティティの両方を高速コピー可能ファイルシステムプラットフォームがpinしないことを確実にすることができる。
【０１７４】
[00172]  上記のファイルシステムは、高速の読み取り及び低速の書き込みを有する。上記のファイルシステムは高速のハッシュ計算も有する。ユーザがファイル又はディレクトリのハッシュを要求する場合、応答は単純にそのチャンクツリーのルートチャンクの物理ファイル名である。これはメタデータと共にリレーショナルデータベース内に記憶することができ、そのため素早く返すことができる。一部の例では、ファイルシステムの全体を通してSHAZ-256ハッシュを使用することができる。他の例では、ファイルシステムの全体を通してSHA3-256ハッシュ（又は他の任意の適切なハッシュ）を使用することができる。
【０１７５】
[00173]  一部の実装形態ではファイルシステムが低速の書き込みを有するが、このファイルシステムは、そのチャンクの１つの中で同じバイトを偶然有する２つのファイルが作成される場合、そのチャンクの単一のコピーだけをメモリ内に物理的に記憶し、それにより記憶空間の消費を減らし、さもなければ作成することができないコピーをユーザが作成できるようにするという利点を有する。例えばライブラリへのリンクをディレクトリ内に作成する代わりに、ユーザは（例えばプロセッサを使用して）単純にそのディレクトリ内に全ライブラリをコピーすることができ、その仮想コピーは実際のコピーよりも少ない記憶域を使用する。
【０１７６】
[00174]  一部の例では、（或るボリュームから別のボリュームであっても）ユーザがファイル又はディレクトリをコピーする場合、物理的にはシステムは（例えばプロセッサを使用して）実際のチャンク自体ではなくエンティティのルートチャンクへのポインタをコピーするに過ぎない。ここでは「ポインタ」は他のエンティティのメタデータ内に、及びデータベース内に記憶されるエンティティのハッシュを意味することができる。ディレクトリ/X/及び/Y/の両方がファイル名Ｎを有するファイルＡを含み、ユーザが/X/Nを修正した場合、システムはＡのコピーとしてＢを作成し、要求された修正をＢに対して行い、Ｂをポイントするように/X/Nからのポインタを変更し、元の/Y/NはＡをポイントさせたままにしておく。
【０１７７】
[00175]  最初に、上記の内容を記載した通りにコード化することができる。つまりそれぞれの書き込みは、ハッシュを再計算すること、及び新たな物理ファイル内に記憶される新たなチャンクを作成することを含むことができる。一部の例では、ＲＡＭ内に書き込みをキャッシュし、単に遅延の後にそれらをディスクメモリに書き込むことによってシステムを高速化することができ、そのため同じファイルへの複数の書き込みがハッシング及びチャンク作成の単一のステップへと合体する。加えてかかる一部の例では、単一のディレクトリ内で変化する複数のファイルが、そのディレクトリ及びディレクトリツリー内のそのディレクトリの上位のディレクトリに対する単一の変化をもたらし得る。その場合、値の読み取りに影響を与えるキャッシュ済みの任意の書き込みが現在あるかどうかを調べるために読み取りの前にデータベースがクエリされる。
【０１７８】
[00176]  一部の実装形態では、ファイルを構成するチャンクをユーザが見ることができず、むしろユーザはファイル自体を見るに過ぎない。しかし他の実装形態では、チャンクハッシュに関係する（例えばプロセッサ内で実行される）幾つかのメソッドを実行するようにシステムを構成することができる。システムは、ファイル又はディレクトリのルートチャンクのハッシュをユーザが見つけることを可能にし得る。これはそのファイル又はディレクトリのハッシュであるように定められ、そのファイル又はディレクトリへのポインタとしてシステム全体を通して使用され得る。
【０１７９】
[00177]  一部の実装形態では、ユーザは、ファイル又はディレクトリツリー又はチャンクのリスト（そのハッシュによって参照される）をバイトのストリームへとシリアル化するための（例えばプロセッサによって実行される）メソッドを呼び出すことができる。或いは又は加えて、一部の実装形態では、ユーザはかかるストリームを逆シリアル化し、自らが選択したディレクトリ内に新たなファイル又はディレクトリを作成するための（例えばプロセッサによって実行される）メソッドを呼び出すことができる。逆シリアル化されたチャンクはトランスペアレントに／見えないようにファイルシステムに追加し、その後、例えば全ファイル又はディレクトリのチャンクが存在するとき、可視ファイル及びディレクトリツリーに変換することができる。逆シリアル化を終えたとユーザが指示する場合、システムは使用されなかった任意のチャンクをガベージコレクションすることができる。かかるガベージコレクションは定期的に（例えば１分に１回、１時間に１回、１日１回等）、散発的に、又は他の任意の所定の時間若しくは時間間隔で行うこともできる。
【０１８０】
[00178]  ユーザがファイルに関して（例えばプロセッサによって実行される）シリアル化メソッドを呼び出す場合、プロセッサは全ファイルを（即ち深さ優先順、行きがけ順探査で全チャンクツリーを）シリアル化し、各チャンクのコンテンツを出力することができる。一部の実装形態では、チャンク名のどれもシリアル化されない。ユーザがディレクトリツリーのシリアル化を要求する場合、プロセッサはディレクトリツリーのディレクトリの深さ優先探索を行い、全ディレクトリツリー（即ちディレクトリツリー内のサブディレクトリ及びファイルのチャンクツリー）をシリアル化することができる。何れの場合にもシリアル化は再帰的に働き、ルートチャンクをシリアル化し、次いでルートチャンクが含むハッシュのそれぞれをシリアル化し、その後も同様に続く。プロセッサが同じチャンクを２回シリアル化しないように、システムはそれまでにシリアル化されたチャンクの指示を記憶し及び／又はかかるチャンクを記憶しておく。
【０１８１】
[00179]  逆シリアル化時に、システムは各チャンクのハッシュをそのコンテンツから（例えばそのチャンクを記憶するためのファイル名を決定するために）計算することができ、そのプロセスの完了後、完全なエンティティの有効な部分にならなかった任意のチャンクを破棄することができる。
【０１８２】
[00180]  システムが１組のチャンクを（それらのハッシュの組を入れることによって）シリアル化する場合、システムはそれらのチャンク内のバイトだけを所与の順序でシリアル化する。メソッドは１組のチャンクによって参照される１組のチャンクを返す。かかる１組のチャンクをユーザが逆シリアル化する場合、そのチャンクがシステムに追加され、システムはユーザのコンピュータ上にまだない１組のチャンクによって参照される１組のチャンクを返す。
【０１８３】
[00181]  システム（又はプロセッサ）は、ファイル又はディレクトリツリーの葉でないチャンクをシリアル化するためのメソッドを実行することもできる。逆シリアル化時に、システムはユーザのシステム上にまだない葉チャンクのハッシュをユーザに返す。そのため、例えばAliceは（計算装置Aliceにおけるプロセッサを使用して）Bobに（計算装置Bobにおけるプロセッサに）葉を、次いで葉でないものをシリアル化することができ、BobはAliceからBobに厳密に何バイト送信されるのかを可能な限り早く知ることになる。又は代替的なシステムでは、AliceがBobに葉でないチャンクをシリアル化することができ、Bobは自分がまだ受信していない葉のハッシュをAliceに知らせることができ、AliceはBobがまだ受信していない葉だけをシリアル化することができる。
【０１８４】
[00182]  チャンクセットのシリアル化の１つの利点は、Bobが既に有する多くのファイルを図らずも含むディレクトリツリーをAliceがBobに効率的に送信できるようにすることである。Aliceはルートチャンクのハッシュだけをまずシリアル化し、それを送信する。Bobはルートチャンクのハッシュを自分が選択したディレクトリ内に逆シリアル化する。（例えばBobにおけるプロセッサによって実行される）そのメソッドの呼び出しがハッシュの非空のリストを返す場合、BobはそのリストをAliceに送信し、Aliceはそれらのチャンクのシリアル化に返信する。次いでBobはチャンクを逆シリアル化し、Bobがまだ有していないと参照するチャンクのリストをAliceに送信する。Bobが全ディレクトリツリーのコピーを有するまでこれが繰り返される。このようにして、AliceはBobが既に有するチャンクを送信することなしに全ディレクトリツリーを転送する。
【０１８５】
[00183]  一部の例では、逆シリアル化の間、リレーショナルデータベースが新たなチャンク、ファイル、及びディレクトリのメタデータを追跡する及び／又は記憶することができる。一部の例では、任意の所与の時点において、ファイル又はディレクトリのチャンク（及び再帰的にそのサブディレクトリのチャンク）の全てが受信されると、ユーザはファイルシステム内に存在するものとしてファイル又はディレクトリを認識することができる。
【０１８６】
[00184]  一部の例では、ユーザが逆シリアル化を終えたことをシステム（又はプロセッサ）によって実行されるdeserializeDoneメソッドが示す。その時点において、システムは有効なエンティティの一部にならなかった任意のチャンクを破棄することができる。逆シリアル化時に、ユーザは新たなファイル又はディレクトリツリーが所与のWRITE許可を有するように設定されることを要求することができる。これはコピー時にも行うことができる。
【０１８７】
[00185]  高速コピー可能ファイルシステムプラットフォームは、
−前回のサインド状態（signed state）以降のファイルシステムデータベースの及び現在のイベントリストのスナップショットを撮るステップと、
−ディスクメモリにそのスナップショットをシリアル化するステップと、
−それらの新たなファイルが今では公式バックアップであることを示すためにディスクメモリ上のバイトを変更するステップと
を含む操作を定期的に行うことができる。
【０１８８】
[00186]  クラッシュ後（更には通常のシャットダウン及び再起動後）、高速コピー可能ファイルシステムプラットフォームは、
−最新のサインド状態をロードすること、
−最新の公式バックアップからイベントを逆シリアル化すること、
−最新の公式バックアップからデータベースを逆シリアル化すること、
−同期と共に通常の高速コピー可能ファイルシステムプラットフォームを実行し始めること等
を行うことができる。
【０１８９】
[00187]  加えて一部の実装形態では、チャンクのガベージコレクションのためにバックグラウンドスレッドを実行することができる。ガベージコレクションスレッドはチャンクディレクトリを定期的に調べ、それらのファイル名をデータベースに照らして確認することができる。ガベージコレクションスレッドが現在のボリュームのどれによっても参照されない、且つ最新のサインド状態によって参照されないチャンクを識別する場合、ガベージコレクションスレッドはそのチャンクをハードドライブから削除すべきである。加えて一部の例では、ガベージコレクションスレッドは既存のチャンク内で定期的に読み取りを行い、それぞれがそのコンテンツのハッシュと一致するファイル名を有することを確認することができる。それらが一致しない場合、そのチャンクをハードドライブから削除することができる。（データベースに応じて）チャンクが引き続き必要な場合、ＤＨＴから又は別のメンバからチャンクを再ダウンロードする措置を取ることができる。
【０１９０】
[00188]  本明細書に記載の一部の実施形態及び／又は方法は、（ハードウェア上で実行される）ソフトウェア、ハードウェア、又はその組み合わせによって実行することができる。ハードウェアは、例えば汎用プロセッサ、書換可能ゲートアレイ（ＦＰＧＡ）、及び／又は特定用途向け集積回路（ＡＳＩＣ）を含み得る。（ハードウェア上で実行される）ソフトウェアは、C、C++、Java（商標）、Ruby、Visual Basic（商標）、及び／又は他のオブジェクト指向、手続き型、若しくは他のプログラミング言語及び開発ツールを含む様々なソフトウェア言語（例えばコンピュータコード）で表すことができる。コンピュータコードの例は、これだけに限定されないがマイクロコード又はマイクロ命令、コンパイラによって作成されるような機械命令、ウェブサービスを作り出すために使用されるコード、及びインタプリタを使用してコンピュータによって実行される高水準命令を含むファイルを含む。例えば実施形態は、命令型プログラミング言語（例えばC、Fortran等）、関数型プログラミング言語（Haskell、Erlang等）、論理型プログラミング言語（例えばProlog）、オブジェクト指向プログラミング言語（例えばJava、C++等）、又は他の適切なプログラミング言語及び／又は開発ツールを使用して実施することができる。コンピュータコードの更なる例には、これだけに限定されないが、制御信号、暗号化コード、及び圧縮コードが含まれる。
【０１９１】
[00189]  「命令」及び「コード」という用語は、任意の種類のコンピュータ可読ステートメントを含むように広く解釈すべきである。例えば「命令」及び「コード」という用語は、１つ又は複数のプログラム、ルーチン、サブルーチン、関数、手続き等を指し得る。「命令」及び「コード」は、単一のコンピュータ可読ステートメント又は多くのコンピュータ可読ステートメントを含み得る。
【図１】
2021501931.tif 000011
【図２Ａ】
2021501931.tif 000012
【図２Ｂ】
2021501931.tif 000013
【図３Ａ】
2021501931.tif 000014
【図３Ｂ】
2021501931.tif 000015
【図４Ａ】
2021501931.tif 000016
【図４Ｂ】
2021501931.tif 000017
【図４Ｃ】
2021501931.tif 000018
【図４Ｄ】
2021501931.tif 000019
【図４Ｅ】
2021501931.tif 000020
【図４Ｆ】
2021501931.tif 000021
【図４Ｇ】
2021501931.tif 000022
【図５（ａ）】
2021501931.tif 000023
【図５（ｂ）】
2021501931.tif 000024
【図５（ｃ）】
2021501931.tif 000025
【図５（ｄ）】
2021501931.tif 000026
【図５（ｅ）】
2021501931.tif 000027
【図５（ｆ）】
2021501931.tif 000028
【図５（ｇ）】
2021501931.tif 000029
【図６】
2021501931.tif 000030
【図７】
2021501931.tif 000031
【図８Ａ】
2021501931.tif 000032
【図８Ｂ】
2021501931.tif 000033
【図８Ｃ】
2021501931.tif 000034
【図８Ｄ】
2021501931.tif 000035
【図９（ａ）】
2021501931.tif 000036
【図９（ｂ）】
2021501931.tif 000037
【図９（ｃ）】
2021501931.tif 000038
【図９（ｄ）】
2021501931.tif 000039
【手続補正書】
【提出日】令和2年6月8日(2020.6.8)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
プロセッサと、
前記プロセッサと電子通信するメモリであって、複数のレコードを含むデータベーステーブルを記憶し、前記複数のレコードからの各レコードはバージョン識別子を含む複合キーを有する、メモリと、
を含む機器であって、前記メモリは、
前記データベーステーブルの第１の仮想クローン及び前記データベーステーブルの第２の仮想クローンを生成すること、
前記第１の仮想クローンにおいて、クエリを受信することであって、前記クエリは、前記第１の仮想クローンに関連するバージョン識別子を含まないこと、
前記第１の仮想クローンにおいて前記クエリを受信することに基づいて、前記第１の仮想クローンに関連するバージョン識別子を前記クエリに追加することにより、前記クエリを修正し、修正済みのクエリを定めること、
（１）前記クエリを満たす１組のレコードからの各レコード、及び（２）前記第１の仮想クローンに関連する前記バージョン識別子の祖先パスに関連するバージョン識別子を有する前記１組のレコードからの各レコードに基づき、前記複数のレコードからの前記１組のレコードを含む応答を生成するために前記修正済みのクエリを使用して前記データベーステーブルをクエリすること、
前記クエリへの応答として前記１組のレコードを含む前記応答を送信すること、
を前記プロセッサに行わせるために実行可能な命令を含み、
前記複数のレコードからの各レコードの前記複合キーが、その複合キーの前記バージョン識別子及びデータ部分を含み、前記複数のレコードは、（１）前記データ部分の値及び前記第１の仮想クローンに関連する前記バージョン識別子を含む複合キー、又は（２）前記データ部分の前記値及び前記第２の仮想クローンに関連する前記バージョン識別子を含む複合キーのうちの１つだけが任意の所与の時点において前記データベーステーブル内に存在するように構成される、機器。
【請求項２】
前記メモリは、
前記第１の仮想クローンによって受信される挿入命令に応答して、前記データベーステーブルにレコードを追加することであって、前記レコードは、データ及び前記第１の仮想クローンに関連するバージョン識別子を有する複合キーを含み、そのため、（１）前記第１の仮想クローンにおいて後で受信され前記データを参照するクエリが前記レコードを返し、（２）前記データを求めて第３の仮想クローンにおいて後で受信されるクエリは前記レコードを返さない、追加すること、
を前記プロセッサに行わせる実行可能な命令を更に含む、請求項１に記載の機器。
【請求項３】
前記命令は、
前記データベーステーブルの第１のレコードのフィールドの値を第１の値から第２の値に更新するための、及び第３の仮想クローンによって受信される命令に応答し、前記データベーステーブルに第２のレコードを追加することであって、前記第２のレコードは前記第２の値及び前記第３の仮想クローンに関連するバージョン識別子を有する複合キーを含む、追加すること、及び
前記第１のレコードの前記フィールドの前記値を更新するための前記命令に応答し、前記第３の仮想クローンに関連する前記バージョン識別子を含まないように前記第１のレコードの複合キーを修正することであって、そのため、
前記第３の仮想クローンにおいて後で受信され、前記フィールドを参照するクエリが前記第２のレコードを返し、
前記第１の仮想クローンにおいて受信され、前記フィールドを参照するクエリが前記第１のレコードを返す、
修正すること
を前記プロセッサに行わせるために更に実行可能である、請求項１に記載の機器。
【請求項４】
前記命令は、
前記複数のレコードからレコードを削除するための、及び第３の仮想クローンによって受信される命令に応答し、前記第３の仮想クローンに関連するバージョン識別子を含まないように前記レコードの前記複合キーの前記バージョン識別子を修正することであって、そのため
前記第３の仮想クローンにおいて後で受信される前記レコードのためのクエリが前記レコードを返さず、
前記第１の仮想クローンにおいて後で受信される前記レコードのためのクエリが前記レコードを返す、
修正すること、
を前記プロセッサに行わせるために更に実行可能である、請求項１に記載の機器。
【請求項５】
前記応答は、第１の応答であり、前記修正済みのクエリは、第１の修正済みのクエリであり、前記命令は、
前記第１の応答がヌルの場合に前記第２の仮想クローンのバージョン識別子を含む第２の修正済みのクエリを生成することであって、前記第２の仮想クローンは前記第１の仮想クローンにとっての祖先である、生成すること、
（１）前記第２の修正済みのクエリを満たす第２の応答の１組のレコードからの各レコード、及び（２）前記第２の仮想クローンの前記バージョン識別子の祖先パスに関連するバージョン識別子を有する前記第２の応答の前記１組のレコードからの各レコードに基づき、前記複数のレコードからの前記１組のレコードを含む前記第２の応答を生成するために前記第２の修正済みのクエリを使用して前記データベーステーブルをクエリすること、及び
前記クエリへの応答として前記１組のレコードを含む前記第２の応答を送信すること、
を前記プロセッサに行わせるために更に実行可能である、請求項１に記載の機器。
【請求項６】
前記命令は、前記第１の仮想クローンが前記第２の仮想クローンの子孫であるという指示を前記メモリ内に記憶することを前記プロセッサに行わせるために更に実行可能である、請求項１に記載の機器。
【請求項７】
前記命令は、前記データベーステーブルの第３の仮想クローンを生成することであって、前記第３の仮想クローンは前記第１の仮想クローンの祖先でも子孫でもなく、前記複数のレコードは前記データ部分の前記値及び前記第３の仮想クローンに関連する前記バージョン識別子を含む複合キーを有するレコードを含む、生成することを前記プロセッサに行わせるために更に実行可能である、請求項１に記載の機器。
【請求項８】
方法であって、
プロセッサにより、データベーステーブルの第１の仮想クローン及び前記データベーステーブルの第２の仮想クローンを生成することであって、前記データベーステーブルは、複数のレコードを含み、前記複数のレコードからの各レコードは、バージョン識別子を含む複合キーを有する、こと、
前記プロセッサにより、前記第１の仮想クローンにおいて、クエリを受信することであって、前記クエリは、前記第１の仮想クローンに関連するバージョン識別子を含まないこと、
前記プロセッサにより、前記第１の仮想クローンにおいて前記クエリを受信することに基づいて、前記第１の仮想クローンに関連するバージョン識別子を前記クエリに追加することにより、前記クエリを修正し、修正済みのクエリを定めること、
前記プロセッサにより、（１）前記クエリを満たす１組のレコードからの各レコード、及び（２）前記第１の仮想クローンに関連する前記バージョン識別子の祖先パスに関連するバージョン識別子を有する前記１組のレコードからの各レコードに基づき、前記複数のレコードからの前記１組のレコードを含む応答を生成するために前記修正済みのクエリを使用して前記データベーステーブルをクエリすること、及び
前記プロセッサにより、前記クエリへの応答として前記１組のレコードを含む前記応答を送信すること、を含み、
前記複数のレコードからの各レコードの前記複合キーが、その複合キーの前記バージョン識別子及びデータ部分を含み、前記複数のレコードは、（１）前記データ部分の値及び前記第１の仮想クローンに関連する前記バージョン識別子を含む複合キー、又は（２）前記データ部分の前記値及び前記第２の仮想クローンに関連する前記バージョン識別子を含む複合キーのうちの１つだけが任意の所与の時点において前記データベーステーブル内に存在するように構成される、方法。
【請求項９】
請求項８に記載の方法であって、
前記第１の仮想クローンによって受信される挿入命令に応答して、前記データベーステーブルにレコードを追加することであって、前記レコードは、データ及び前記第１の仮想クローンに関連するバージョン識別子を有する複合キーを含み、そのため（１）前記第１の仮想クローンにおいて後で受信され前記データを参照するクエリが前記レコードを返し、（２）前記データを求めて第３の仮想クローンにおいて後で受信されるクエリは前記レコードを返さない、追加すること、
を更に含む、方法。
【請求項１０】
請求項８に記載の方法であって、
前記データベーステーブルの第１のレコードのフィールドの値を第１の値から第２の値に更新するための、及び第３の仮想クローンによって受信される命令に応答し、前記データベーステーブルに第２のレコードを追加することであって、前記第２のレコードは前記第２の値及び前記第３の仮想クローンに関連するバージョン識別子を有する複合キーを含む、追加すること、及び
前記第１のレコードの前記フィールドの前記値を更新するための前記命令に応答し、前記第３の仮想クローンに関連する前記バージョン識別子を含まないように前記第１のレコードの複合キーを修正することであって、そのため、
前記第３の仮想クローンにおいて後で受信され、前記フィールドを参照するクエリが前記第２のレコードを返し、
前記第１の仮想クローンにおいて受信され、前記フィールドを参照するクエリが前記第１のレコードを返す、
修正すること、
を更に含む、方法。
【請求項１１】
請求項８に記載の方法であって、
前記複数のレコードからレコードを削除するための、及び第３の仮想クローンによって受信される命令に応答し、前記第３の仮想クローンに関連するバージョン識別子を含まないように前記レコードの前記複合キーの前記バージョン識別子を修正することであって、そのため
前記第３の仮想クローンにおいて後で受信される前記レコードのためのクエリが前記レコードを返さず、
前記第１の仮想クローンにおいて後で受信される前記レコードのためのクエリが前記レコードを返す、
修正すること、
を更に含む、方法。
【請求項１２】
請求項８に記載の方法であって、
前記応答は、第１の応答であり、前記修正済みのクエリは、第１の修正済みのクエリであり、前記方法は、
前記第１の応答がヌルの場合に前記第２の仮想クローンのバージョン識別子を含む第２の修正済みのクエリを生成することであって、前記第２の仮想クローンは前記第１の仮想クローンにとっての祖先である、生成すること、
（１）前記第２の修正済みのクエリを満たす第２の応答の１組のレコードからの各レコード、及び（２）前記第２の仮想クローンの前記バージョン識別子の祖先パスに関連するバージョン識別子を有する前記第２の応答の前記１組のレコードからの各レコードに基づき、前記複数のレコードからの前記１組のレコードを含む前記第２の応答を生成するために前記第２の修正済みのクエリを使用して前記データベーステーブルをクエリすること、及び
前記クエリへの応答として前記１組のレコードを含む前記第２の応答を送信すること、
を更に含む、方法。
【請求項１３】
請求項８に記載の方法であって、
前記第１の仮想クローンが前記第２の仮想クローンの子孫であるという指示を記憶することを更に含む、方法。
【請求項１４】
請求項８に記載の方法であって、
前記データベーステーブルの第３の仮想クローンを生成することであって、前記第３の仮想クローンは前記第１の仮想クローンの祖先でも子孫でもなく、前記複数のレコードは前記データ部分の前記値及び前記第３の仮想クローンに関連する前記バージョン識別子を含む複合キーを有するレコードを含む、生成することを更に含む、方法。
【請求項１５】
プロセッサ実行可能命令を含む非一時的プロセッサ可読媒体であって、前記プロセッサ実行可能命令は、
プロセッサにより、データベーステーブルの第１の仮想クローン及び前記データベーステーブルの第２の仮想クローンを生成することであって、前記データベーステーブルは、複数のレコードを含み、前記複数のレコードからの各レコードは、バージョン識別子を含む複合キーを有する、こと、
前記プロセッサにより、前記第１の仮想クローンにおいて、クエリを受信することであって、前記クエリは、前記第１の仮想クローンに関連するバージョン識別子を含まないこと、
前記プロセッサにより、前記第１の仮想クローンにおいて前記クエリを受信することに基づいて、前記第１の仮想クローンに関連するバージョン識別子を前記クエリに追加することにより、前記クエリを修正し、修正済みのクエリを定めること、
前記プロセッサにより、（１）前記クエリを満たす１組のレコードからの各レコード、及び（２）前記第１の仮想クローンに関連する前記バージョン識別子の祖先パスに関連するバージョン識別子を有する前記１組のレコードからの各レコードに基づき、前記複数のレコードからの前記１組のレコードを含む応答を生成するために前記修正済みのクエリを使用して前記データベーステーブルをクエリすること、及び
前記プロセッサにより、前記クエリへの応答として前記１組のレコードを含む前記応答を送信することのための命令であり、
前記複数のレコードからの各レコードの前記複合キーが、その複合キーの前記バージョン識別子及びデータ部分を含み、前記複数のレコードは、（１）前記データ部分の値及び前記第１の仮想クローンに関連する前記バージョン識別子を含む複合キー、又は（２）前記データ部分の前記値及び前記第２の仮想クローンに関連する前記バージョン識別子を含む複合キーのうちの１つだけが任意の所与の時点において前記データベーステーブル内に存在するように構成される、非一時的プロセッサ可読媒体。
【請求項１６】
請求項１５に記載の非一時的プロセッサ可読媒体であって、
前記第１の仮想クローンによって受信される挿入命令に応答して、前記データベーステーブルにレコードを追加することであって、前記レコードは、データ及び前記第１の仮想クローンに関連するバージョン識別子を有する複合キーを含み、そのため、（１）前記第１の仮想クローンにおいて後で受信され前記データを参照するクエリが前記レコードを返し、（２）前記データを求めて第３の仮想クローンにおいて後で受信されるクエリは前記レコードを返さない、追加することのためのプロセッサ実行可能命令を更に含む、非一時的プロセッサ可読媒体。
【請求項１７】
請求項１５に記載の非一時的プロセッサ可読媒体であって、
前記データベーステーブルの第１のレコードのフィールドの値を第１の値から第２の値に更新するための、及び第３の仮想クローンによって受信される命令に応答し、前記データベーステーブルに第２のレコードを追加することであって、前記第２のレコードは前記第２の値及び前記第３の仮想クローンに関連するバージョン識別子を有する複合キーを含む、追加すること、及び
前記第１のレコードの前記フィールドの前記値を更新するための前記命令に応答し、前記第３の仮想クローンに関連する前記バージョン識別子を含まないように前記第１のレコードの複合キーを修正することであって、そのため、
前記第３の仮想クローンにおいて後で受信され、前記フィールドを参照するクエリが前記第２のレコードを返し、
前記第１の仮想クローンにおいて受信され、前記フィールドを参照するクエリが前記第１のレコードを返す、
修正することのためのプロセッサ実行可能命令を更に含む、非一時的プロセッサ可読媒体。
【請求項１８】
請求項１５に記載の非一時的プロセッサ可読媒体であって、
前記複数のレコードからレコードを削除するための、及び第３の仮想クローンによって受信される命令に応答し、前記第３の仮想クローンに関連するバージョン識別子を含まないように前記レコードの前記複合キーの前記バージョン識別子を修正することであって、そのため
前記第３の仮想クローンにおいて後で受信される前記レコードのためのクエリが前記レコードを返さず、
前記第１の仮想クローンにおいて後で受信される前記レコードのためのクエリが前記レコードを返す、
修正することのためのプロセッサ実行可能命令を更に含む、非一時的プロセッサ可読媒体。
【請求項１９】
請求項１５に記載の非一時的プロセッサ可読媒体であって、
前記応答は、第１の応答であり、前記修正済みのクエリは、第１の修正済みのクエリであり、前記非一時的プロセッサ可読媒体は、
前記第１の応答がヌルの場合に前記第２の仮想クローンのバージョン識別子を含む第２の修正済みのクエリを生成することであって、前記第２の仮想クローンは前記第１の仮想クローンにとっての祖先である、生成すること、
（１）前記第２の修正済みのクエリを満たす第２の応答の１組のレコードからの各レコード、及び（２）前記第２の仮想クローンの前記バージョン識別子の祖先パスに関連するバージョン識別子を有する前記第２の応答の前記１組のレコードからの各レコードに基づき、前記複数のレコードからの前記１組のレコードを含む前記第２の応答を生成するために前記第２の修正済みのクエリを使用して前記データベーステーブルをクエリすること、及び
前記クエリへの応答として前記１組のレコードを含む前記第２の応答を送信すること、
のためのプロセッサ実行可能命令を更に含む、非一時的プロセッサ可読媒体。
【請求項２０】
請求項１５に記載の非一時的プロセッサ可読媒体であって、
前記第１の仮想クローンが前記第２の仮想クローンの子孫であるという指示を記憶することのためのプロセッサ実行可能命令を更に含む、非一時的プロセッサ可読媒体。
【請求項２１】
請求項１５に記載の非一時的プロセッサ可読媒体であって、
前記データベーステーブルの第３の仮想クローンを生成することであって、前記第３の仮想クローンは前記第１の仮想クローンの祖先でも子孫でもなく、前記複数のレコードは前記データ部分の前記値及び前記第３の仮想クローンに関連する前記バージョン識別子を含む複合キーを有するレコードを含む、生成することのためのプロセッサ実行可能命令を更に含む、非一時的プロセッサ可読媒体。
【国際調査報告】
2021501931.tif 000040
2021501931.tif 000041
2021501931.tif 000042