×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。



>> ユーザーガイド >> データの格納 >> ユーザープロパティ | ScriptDb | スプレッドシート | JDBC


ScriptDb

ScriptDはGoogle.Apps.ScriptのためのJavaScriptオブジェクトのデータベースです。各スクリプトプロジェクトは、JavaScriptオブジェクのトデータを保存・更新・検索するために使用できるデータベースを取得します。
マップはトップレベルの項目でなければならないのに、これらの機能の利用によって、任意のネストの組み合わせによるマップ、配列、文字列と数値を恒久的に格納することができます。
従業員レコードを表すオブジェクトを例にとって見ます。


{type: 
"employee"
, employee_id:
1
, name: {first:
"Fatima"
, initial:
"S"
,
last:
"Pauli"
}, address: {street: "4076 Washington Avenue", city:
"Jackson"
, state:
"MS"
, zip:
"39201"
}, department_id:
52
}

ここでは、従業員型をつくり、IDが1の場合その人の名前はFatima S. Pauliである・・・となっています。”万能”な属性というものはありません。つまり、すべての属性の名前と値は完全にユーザが定義します。

すべてのScriptDbオブジェクトは、保存されるときにシステムによって割り当てられたIDを持っています。これは不明瞭で不変な文字の値なのです。ScriptDbオブジェクトはIDによって取得することも、検索クエリによって取得することもできます。


WWW GoogleStyle


ScriptDb入門

はじめに知っておくべきAPIの呼び出しは、データベースにアクセスする方法です。現在、ScriptDbでデータベースを取得する方法は、データベース・インスタンスを返すScriptDb.getMyDb()を使うことです。 そうすれば、その後にデータベース・インスタンスを使用するためのアクセスができます。 データベースのデータ範囲は、現在のスクリプトやライブラリーで、進行中のJavaScriptコードの場合は他のスクリプトやライブラリーも含まれます。 将来的には、カレントのスクリプトに付属したデータベース以上のものを取得できるかもしれません。



データの保存

データベースへのアクセス権を得られれば、save()メソッドを介してオブジェクトを次のように保存することができます。


var
db =
ScriptDb.
getMyDb();
var
ob = {type:
"employee"
, employee_id:
1
, name: {first:
"Fatima"
, initial:
"S"
,
last:
"Pauli"
}, address: {street:
"4076 Washington Avenue"
, city:
"Jackson"
, state:
"MS"
, zip:
"39201"
}, department_id:
52
};
var
stored = db.save(ob);

現在、属性名にはドットまたは角括弧などの特殊文字を含めることはできません。属性値にはこの制限はありません。


データの変更

上記のセクションで格納したオブジェクトを見てみましょう。オブジェクトに変更を加えるためには、load()またはquery()を呼び出したり、またはsave()からのリターンによって、データベースからフェッチしたオブジェクトを所持している必要があります。 データベースからロードされたオブジェクトは、IDを認識しています。getId()で呼び出して、その後load()を介してから利用します。 上記のコードで保存した設定データを変更してみましょう。


stored.foo=
'bar'
; db.save(stored);

これに代わって、クエリによるこれらのオブジェクトの変更もできます。


var ob = db.query({employee_id: 
29
}).
next()
; ob.name.first =
'Fred'
; db.save(ob);



IDでロード

オブジェクトのIDが分かっていれば、loadを呼び出すことでオブジェクトをロードできます。


var
loaded = db.load(stored.getId());

オブジェクトIDは、他のオブジェクトからの外部キーの値として使用することができます。IDの配列を使用しているようなケースでは、必要に応じて複数のオブジェクトをロードすることができます。


var
loaded = db.load
([
id_1, id_2, id_3
])
;

ここでは、ID_1、ID_2、ID_3は、idsの文字列の値を保持する変数です。(具体的には、ここのidはリテラルではありません)



データの削除

データベースからオブジェクトを削除する方法は2通りあります。


db.remove(some_object_you_loaded);

もし、オブジェクトのIDが分かるなら下の通りです。


db.remove(object_id);


バルク操作

一度にすべての作業を行いたい時、事前にオブジェクトの数を知っていればScriptDbも一括操作が可能になります。たとえば、db.saveBatch()があります。


var
saveResults = db.saveBatch(someArrayOfObjects,
false
);

いくつか説明しておく必要があります。まず、最後の引数falseです。これは最小単位(原子性)フラグです。もしこれがtrueの場合はすべてのオブジェクトを格納するかまたは一緒にしないかです。 今のところ、オブジェクトの配列に2つ以上の項目が含まれている場合は、falseであることが必要です。
2つ目に保存結果です。大変稀ですが、いくつかのオブジェクトが保存される可能性があるため、ArrayOfObjects配列に対応する項目が保存に失敗したことを示すMutationResultオブジェクトが含まれる結果があるのです。 この発生は非常に珍しいことなので、すぐに成功を確認するために使用できるdb.allOk()メソッドがあります。


var
results = db.saveBatch(array_of_obs,
false
);
if
(db.allOk(results)) {
// everything went swimmingly, proceed
}
else
{
// partial or no success
for
(
var
i = 0 ; i < results.length; i++) {
var
item = results[i];
if
((
typeof
item.success) ==
'function'
&&
!item.success()) {
//do something with failed object
} } }

同様のdb.removeBatchdb.removeByIdBatchを呼び出しに行く一般的なパターンでは、(typeof item.success) == 'function' &&をif文から省略して保存します。



データベースの照会

データベースの検索は、下の例のように行われます。クエリを作成するには、検索したいオブジェクトのサブセットを指定します。たとえば、(少なくとも)1のemployee_idを持つオブジェクトを検索するには下のように行います。


var
db =
ScriptDb.
getMyDb();
var
result = db.query
({
employee_id:
1
})
;

結果のオブジェクトは、結果を反復するためのnext()hasNext()メソッドを持っている点でJavaのイリテーターに似ています。 結果を反復処理する一般的なイディオムは次のようになります。


while
(result.hasNext()) {
var
current = result.
next()
; do_something_with(current); do_something_else_with(current); }

クエリの結果の数が返されるresult.getSize()があります。この上限を指定するか、または改ページ(ページ付け)を使用している場合、結果の数がその限度の最大値、またはページサイズになります。 制限値を指定しなかった場合、デフォルトの制限値(現在200)が適用されます。クエリで取得ができる結果の最大数は、現在50,000です。

属性と値のペア(employee_idと1)を持っているデータベース内に他の多くの項目があるとしたらば、結果を絞り込むために、クエリオブジェクト内の複数の項目を指定することができます。 上記の例では、型と呼ばれるアイテムがあるので次の操作を実行できます。


var
result = db.query({employee_id:
1
, type:
"employee"
});

このクエリでは、employee_idで値1をもつ"従業員"で、タイプの値が "employee"の両方を持っている任意の項目を返します。クエリにはAND論理を利用して項目を追加できると考えて差し支えありません。

住所がミシシッピ(MS)またはニューヨーク(NY)のいずれかに含まれている人をすべて探したいと思ったら、OR論理を使う方法が必要となります。これには、下のようにデータベース上でanyOfメソッドを通して行われます。


var
result = db.query({ address: { state: db.anyOf([
"NY"
,
"MS"
]) } });

クエリ内の属性は、最上位レベルの属性である必要はないですが、埋め込まれた属性にすることができます。同様に、市区町村と都道府県を問い合わせることもできます。


var
result = db.query({address: db.anyOf([ {city:
"Jackson"
, state:
"MS"
}, {city:
"New York"
, state:
"NY"
}]});

これは、必要なデータを取得する方法の95%を取得します。残ったビットはNOT論理のものです。


var
result = db.query( {address: {city:
"Cleveland"
, state: db.not(
"TX"
)}});


比較演算子

クエリを記述するときに常に等価性をチェックする必要はありません。相対値をチェックするために使えるいくつかのメソッドがあります。値がxよりも大きい場合にそれらの値を返すdb.greaterThan(x)があります。


var
result = db.query({ is_person:
true
, age: db.greaterThan(
21
)});

似たようなものに>greaterThanOrEqualTo、lessThan、lessThanOrEqualToがあり、同様の方法で動作します。

非常に似たものにBetween演算子があります。2つの引数は、含まれている下限と上限(数学用語でいう半開区間)です。データベース内のティーンエイジャーである人をすべて見つけたい場合は、このようなクエリを使えばよいでしょう。


var
result = db.query({ is_person:
true
, age: db.between(
13, 20
)});


ソートと改ページ

もし、順序付けられた方法で得られる多くの結果があるときは、関連する一塊でそれらを処理できれば便利でしょう。結果のページネーション(改ページ)を処理するには2つの方法があります。 startAt()/limit()または、paginate(page_number, num_per_page)です。


// returns 50 results starting at result #100
var
result = db.query(...).startAt(
100
).limit(
50
);
// returns the 4th page of 25 result pages.
var
result = db.query(...).paginate(
3, 25
);

デフォルトの制限は200件です。最上限は50,000であり、一般的には任意のクエリ結果の最大数となります。

結果のページネーションは便利ですが、順序付けた基準を加えてやれば、さらに便利になります。sortByメソッドは、いくつかの異なる方法でクエリ結果に対して呼び出すことができます。 デフォルトの並べ替えは昇順でです。フィールドが数値であれば、数値に応じてScriptDbに順序を伝えることができます。2のあとに10という具合です。同様に、降順を指定することができます。 フィールド指定子は、JavaScriptコード内のフィールドを処理する手段です。


db.query
(...).
sortBy(
"address.city"
); db.query
(...).
sortBy(
"address.zip"
, db.NUMERIC); db.query
(...).
sortBy(
"address.zip"
, db.DESCENDING); db.query
(...) .
sortBy(
"address.zip"
, db.ASCENDING, db.LEXICAL);

数字のように見える文字列は、結果に返されたデータが格納されたかどうかに関わらずNUMERICのソート時に正しくソートされます。また、{foo: 23}と{foo: "23"}というクエリは等価です。 真は1、偽は0のように真偽値のソートも同様です。数値の1/0と文字列の"true"/"false"に対してのクエリも行えます。



型の等価性

利便性を考えて、自動型に同値が利用できます。数値を持つオブジェクトがある場合は、同じ値の文字列に問い合わせることができます。たとえば、オブジェクト{A:23}を格納する場合、{A: "23"}でも可能で、ScriptDbはオブジェクトを見つけ出します。 逆に、{A: "23"}を格納して、{A:23}をクエリで探し出すことも問題ありません。多少異なるが、ブール値でも動作します。
ゼロではない値を持つすべての数値は、ブール値trueと等価で、ゼロとなる数値はブール値falseと評価されます。空でない文字列はブール値trueと等価、空の文字列はfalseに相当します。 すべてのオブジェクトおよび配列の値はtrueです。文字列"0""false"は、ブール値trueと等価であることに注意してください。唯一の空の文字列がfalseと等価であるのと同じです。 フィールドxに何らかが(従来のデータベースシステムではnon-null)セットされているすべてのオブジェクトを探そうとしたら、{field: db.anyOf([true, false])}で問い合わせができるのですが、すでにあるdb.anyValue()は、これをより簡単に処理します。



ScriptDbの適用

ScriptDbの基本的な使用方法が理解できたので、このセクションでは、実際のユースケースに基本的な概念を適用する方法について説明します。

テーブル表

思いつく最初の疑問は次のようなものでしょう。複数のテーブルが利用できるのかどうか;ScriptDbを使ったら実際のところ複数のテーブルは利用できません。 代わりに、データをサイロの形状にすればよいのです。サイロはデータの論理的なサブセットです。これらのサイロは、個別または、重複するデータのサブセットです。

たとえば、従来のデータベース内のテーブルは、データベースに含まれるデータの異なるサブセットです。1つのテーブル内に行を持っている場合(コピーが他のテーブルにある可能性はありますが)、基本的に他のテーブルには存在しないものです。
従来のRDBMS(Relational.DataBase.Management.System)ではサブセットを一致させるため、一般的にこれらのサブセットは、サブセットを決定するための列の値を利用して同じテーブル内に存在する必要があります。 ScriptDbを使用して、これらのサイロを作成するベストプラクティスがあります。異なるサブセットにはtype属性を使用する必要があります。 従来のデータベースへ至る最も近いマップがテーブルを作成します。たとえば、従業員テーブル内の各レコードに対して、従業員を表すオブジェクトへ属性/値のペアを追加することができます。


table: 
"employee"

念のため、ここではテーブルの属性名に関するマジックは何もありません。これはtype属性に使用している名前です。画表、メサ、または別に選んだ名前を属性名として利用できたものです。

サブセットを一致させるためにタイプフラグを使用します。たとえば、従業員を表すオブジェクトに属性/値のペアを追加することができます


is_employee: 
true

これは単純なtrue / false値である必要はありません。たとえば、属性/値のペアが下の例のように電子メールアドレスを持つサイロであってもよいのです。


  email: 
"fred@example.com"

他のレコードの場合、メールアドレスは明らかに異なります。単一のメールが複数のラベルを持つことができるGmail.labelsのようなものと考えてよいでしょう。

ScriptDb内のクエリは比較的高速なので、一回のクエリですべてのデータをプルする必要はありません。データの構造化がこれを助けます。

原子性とトランザクション

ScriptDbには、通常のリレーショナルデータベースの意味でのトランザクションはありません。 トランザクションは、この種のユースケースのために設計されたLock.Serviceを使ってエミュレートすることができます。 次の例は、オブジェクトのカウント変数をインクリメントしたい場合のサンプルです。


var
lock = LockService.getPublicLock(); lock.waitLock(
30000
);
try
{
var
obj = db.load(the_object_id); obj.count = obj.count + 1; db.save(obj); }
finally
{
// make sure it gets released even if we blow up
lock.
release(); }


サンプル

日付

JavaScriptのDateオブジェクトを直接格納することはサポートされていません。これには、いくつかの理由があります。先ず最初に、一般的にオブジェクトからJSONに変換後、戻されるのが普通だからです。そして、JavaScriptのDateオブジェクトは、この変換を存続させません。
変換の間JavaScriptのDateオブジェクトは、文字列に代わりますが、これが問題を引き起こす可能性があるのです。
2つ目の理由です。JavaScriptはタイムゾーンの周辺操作にいくつかの制限があります。たとえば、Dateオブジェクトに別のタイムゾーンを設定することはできません。

しばらくの間は、ユースケースに応じた日付データを格納する方法として提案しておきます。 日付に基づいた検索ではない、または日付の範囲検索(すなわち、日付属性が2つの値の間にあるオブジェクトを求めている場合)のときは、下のようにDateオブジェクトから数値のタイムスタンプを格納します。


db.save({my_date_attr: my_date_object.getTime()});

次に、再構成する日まで:


var
loaded_date =
new
Date(object_i_loaded.my_date_attr);

日付オブジェクトの個々のフィールドを照会できるようにしたい場合は、次のように日付を格納すれば行うことができます。


db.save({
  my_date_attr: {
    timestamp: my_date_object.getTime(),  
// so you can recreate the original date object
day_of_week: my_date_object.getDay(),
// 0 is Sunday, 1 is Monday, etc.
year: my_date_object.getFullYear(),
// full 4-digit year
month: my_date_object.getMonth()
// 0 is January, 2 is February, etc.
// and so on....
},
// other fields in your object
});

このように格納すれば、my_date_attrが月曜日であったすべてのレコードが次のように検索できます。


var
mondayResults = db.query({my_date_attr.day_of_week: 1});

タイムゾーンと日付

タイムゾーンの問題はScriptDbに固有のものではなく、むしろJavaScriptの日付処理の方法がアーティファクトだからです。スクリプトで複数のタイムゾーンを扱う場合は、次にあげるベストプラクティスに従うことが重要です。

タイムスタンプの値は時間の絶対インスタントを参照していることに注意が必要です。午前10時ESTを表す日付を新規に格納する場合、PSTにあるタイムゾーンでこれをスクリプトで読み込むと午前7時PSTが表示されます。

そして、このスクリプトが別のタイムゾーンのユーザーによって実行されれば、日付は、実行スクリプトのために現在の有効なタイムゾーンによって計算されます。

getTimezoneOffsetを呼び出して、日付オブジェクトからのオフセット(分単位)でタイムゾーンを取得することができます。DSTを監視しているタイムゾーンを忘れないようにしてください。 タイムゾーン用のオフセットは、年間を通じて一定ではありませんが、タイムゾーンの問題を軽減するために使用することができます。

JavaScriptのDateオブジェクトがUTCタイムゾーンに応じて、年、月、日などの値を取得するためのgetUTCで始まるメソッドを持っていることも参考になるでしょう。

データベース間のオブジェクトコピー

データベース間でのオブジェクトのコピーは大変簡単にできます。データベース・オブジェクトAとBを持っていて、コピーしたいオブジェクトはid:fooを持っていると仮定します。


var
source = storea.load(foo);
var
copied = storeb.save(source);

copied.getId()source.getId()とは別のものを返すことに注意してください。

スプレッドシートをデータベースにコピー

データを格納したいスプレッドシートがあるとします。最初の行がオブジェクトで使用される属性名である場合、次のスクリプトは、シートの内容を取得してデータベースに格納します。


function
loadDatabaseFromSheet
() {
var
spreadsheet =
SpreadsheetApp.
openById
(
id_of_your_sheet
);
var
columns = spreadsheet.getLastColumn
();
var
data = sheet.getDataRange
().
getValues
();
var
keys = data
[
0
];
var
db =
ScriptDb.
getMyDb
();
for (var row =
1;
row
<
data.length; row
++
) {
var
rowData = data[row];
var
item =
{};
for (var column =
0
; column
<
keys.length; column
++
) { item[keys[column
]] =
rowData
[
column
];
}
db.save(item);
}
}

データベースを新規シートにコピー

この例では列の順序は、疑似ランダムになります。特定の順序が必要な場合は、書いてある行を変更する必要があります。


var headings = Object.keys(keys);

変更後;

var headings = [my array of headings in the order I want them];


function
dumpDatabaseIntoSheet(result) {
var
db =
ScriptDb.
getMyDb();
// You can change the query below to restrict what to put into
// the Spreadsheet, or change ordering, etc. Do note the default
// query result size limit!
var
result = db.query({});
var
data = [];
var
keys = {};
// load in data and find out the object keys
while
(result.hasNext()) {
var
item = result
.next
()<;
var
itemKeys =
Object.
keys(item);
for
(
var i
=
0
; i
<
itemKeys.length; i
++
) {
if
(
typeof
(item[itemKeys[i]]) !=
'function'
) { keys[itemKeys[i]] =
true
; } } data.push(item); }
var
headings = Object.keys(keys);
var
values = [headings];
// produce the values array containing the bits from the result
// objects
for
(
var
rownum =
0
; rownum
<
data.length; rownum
++
) {
var
thisRow = [];
var
item = data[rownum]; for (var i = 0; i < headings.length; i++) {
var
field = headings[i];
var
thisValue = item[field];
if
(thisValue ==
undefined
||
typeof
(thisValue) ==
'function'
) { thisValue = null; } thisRow.push(thisValue); } values.push(thisRow); }
var
spreadsheet =
SpreadsheetApp.
openById(
**
id_of_some_existing_sheet
**);
var
newSheet = spreadsheet.insertSheet();
// make a new sheet
var
range = newSheet.getRange(
1, 1,
values.length, headings.length); range.setValues(values); }

データベースからすべての項目を削除

データベースに大量のデータを追加したところ、残念ながらミスを犯した場合、データベースからすべてのデータを削除する方法です。


function
deleteAll() {
var
db =
ScriptDb.
getMyDb();
while
(
true
) {
var
result = db.query({});
// get everything, up to limit
if
(result.getSize() ==
0
) {
break
; }
while
(result.hasNext()) { db.remove(result.
next
()); } } }

データベースがどのくらい多くの項目があるかによりますが、このスクリプトは現在の最大スクリプト実行制限時間(6分)を超える可能性があるので、スクリプトが途中で終了できるようにします。 ただし、再度、必要に応じてデータベースが空になるまで実行できます。

自分のデータベース

実用的ではないかもしれませんが、自分の持っているデーベースがどんなものであったかを知りたい場合があります。次の関数を使用してデータベースの内容と与えられたクエリの結果を表示させることができます。


function
showAll() {
var
db =
ScriptDb.
getMyDb();
var
results = db.query({});
while
(results.hasNext()) {
var
result = results.
next
();
Logger.
log(
Utilities.
jsonStringify(result)); } }


他のシステムとの動作比較

オペレーションSQLScriptDb
InsertINSERT INTO bar (a, b) VALUES (1, 'foo')db.save({a: 1, b:'foo'})
UpdateUPDATE bar SET a=5, b='baz' WHERE id='id'var item = db.load(id);
item.a = 5;
item.b = 'baz';
db.save(item);
DeleteDELETE FROM bar WHERE id='id'var item = db.load(id);
db.remove(item);
LookupSELECT * FROM bar WHERE id = 'id';db.load(id)
QuerySELECT * FROM bar WHERE foo='bar' AND fred='barney'db.query( {foo: 'bar', fred: 'barney'})
QuerySELECT * FROM bar WHERE foo IN('bar', 'baz')db.query( {foo: db.anyOf(['bar', 'baz'])})


ScriptDbとライブラリー

ライブラリと一緒にScriptDbを使用する場合、注意すべきことがいくつかあります。まず、ScriptDbインスタンスは、そのプロジェクトに関連付けられています。 これは、インスタンスがScriptDb.getMyDb()が呼び出されたプロジェクトに結びついていることを意味します。たとえば、下のようにコードが含まれているライブラリがある場合;


function
getData() {
var
db = ScriptDb.getMyDb();
// do stuff with db
}

getDataが他のプロジェクト内のスクリプトによって呼び出されたとき、それは呼び出したプロジェクトではなく、常にライブラリーのScriptDbインスタンス上で動作します。 これは、自分のライブラリーの呼び出しを介してScriptDbインスタンスを共有するための一般的な方法です。一箇所でインスタンスを操作するデータベースコード所持するのは最善の方法です。 そこで、もし格納したものの変更手段が必要になっても、一箇所で探し物が簡単に見つかるというわけです。

データベース・インスタンスを取得するために一元化する場所

他のプロジェクトから利用したい、プロジェクトのScriptDBインスタンスのハンドルを返す中心的な場所が欲しいことがあります。これを行うには、インスタンスを取得するために呼び出す関数を持つプロジェクトを作成します。


function
getDb() {
return
ScriptDb.
getMyDb(); }

この後、他のプロジェクトから利用するために、ライブラリーとしてこのオリジナルなプロジェクトを含み、呼び出すだけです。(明らかにライブラリの名前が異なる場合があります)


function
somethingInMyProject() {
var
db = MyCentralizedDbInclude.getDb();
// do stuff with db
}

ライブラリにデータベースを渡す

プロジェクトのライブラリーよりも、データベース・インスタンスの呼び出しを利用したいようなときは、データベース・インスタンスがライブラリに渡されなければならないでしょう。 これを実現させるために、ライブラリ内に次のような関数を持たせることができます。


function
getData(db) {
// do stuff with db
}

ここでは、データベース・インスタンスを持つプロジェクトの呼び出しは、ごく普通の方法です。ライブラリ内にデータベースのメソッドがある場合は、そでぞれのメソッドにインスタンスを渡すのは面倒です。 そこで、次のような関数を持つのもひとつの方法です。


function
setDb(passedInDb) { db = passedInDb(); }

この後スクリプトは、下のように呼び出します。


MyIncludedLibrary.
setDb(
ScriptDb.
getMyDb());

プロジェクトの呼び出しで、ライブラリー内のメソッドを、それらにインスタンスを渡さずに呼び出せます。そして、ライブラリー内では、下のようにdb変数を利用できるようになります。


function
getData() {
// do stuff with db
}



よくある質問

データベース上のクォータ(割り当て)は?

現在のところ;
consumer-accounts;50MB
Google-Apps-accounts;100MB
Google.Apps.for-Business/Education/Government-accounts;200MB

この制限は、各データベースでそれぞれのユーザーごとです。

スクリプトをWebアプリとして公開するには?

通常通り動作します。具体的には、スクリプトは、ユーザごとに1つずつではなく、単一のデータベースを持っています。 Webアプリケーションとして公開の場合、ScriptDbの割り当てはスクリプトの所有者に対してカウントされます。

大規模データセットでのパフォーマンスは?

挿入、更新、削除のパフォーマンスはScriptDbデーターベースのサイズに関係なく、ほぼ一定です。クエリにかかる時間だけは、結果数に基づきます。

通常のパフォーマンスは?

Google.Apps.Scriptは、データベースに関するいくつかの情報をロードする必要があります。現在のところ最初の操作は、それ以降と比べると50msほど時間がかかります。

オブジェクトはどのくらいの大きさにすることができるか?

現在の制限は、降順の影響に於ける少々の基準に基づいています。データの、更新、ネストレベル、属性名の長さ、属性の数、値の大きさがどのくらい変更されるかが問題となります。

一般的なアプリケーションならば、属性名が少数で短くなり、ネストはほとんど深くならない傾向にあります。こういう状態ならば、生の保存を目指すなら実際の値のデータは約4kBが制限になります。 最大合計約8-9KBに対して、最高で約3-4KB追加できます。

プロジェクトを削除するとデータベースも削除されるのか?

はい、削除されます。

格納できるオブジェクト数に制限はあるのか?

クエリの結果は50,000で使い切る一方で、データベースそれ自身は、許容割り当分と同程度にオブジェクトを含むことができます。



2012-11-01

pageTOP