「XMLDBのキーおよびインデックスの命名 (Dev docs)」の版間の差分
Toshihiro KITA (トーク | 投稿記録) 編集の要約なし |
Toshihiro KITA (トーク | 投稿記録) 編集の要約なし |
||
(同じ利用者による、間の14版が非表示) | |||
1行目: | 1行目: | ||
[[XMLDBドキュメンテーション|XMLDB ドキュメンテーション]] > XMLDBのキーおよびインデックスの命名 | [[XMLDBドキュメンテーション (Dev docs)|XMLDB ドキュメンテーション]] > XMLDBのキーおよびインデックスの命名 | ||
---- | ---- | ||
DB 内のオブジェクトにはそれぞれ名前がついています。テーブル名やフィールド名はわかりやすいですが、キー、インデックス、シーケンスなど、わかりにくい名前で作成されているものもあります。このページでは、これらのオブジェクトが XMLDB ジェネレータによって圧縮された方法で命名される方法を少し説明しようと思います。 | DB 内のオブジェクトにはそれぞれ名前がついています。テーブル名やフィールド名はわかりやすいですが、キー、インデックス、シーケンスなど、わかりにくい名前で作成されているものもあります。このページでは、これらのオブジェクトが XMLDB ジェネレータによって圧縮された方法で命名される方法を少し説明しようと思います。 | ||
まず知っておいていただきたいのは、[[XMLDB XML構造の定義 (Dev docs)|XMLDB スキーマファイル]] のもとでは、主にいくつかの[[XMLDB XML構造の定義 (Dev docs)#規約|厳密な規則]] に従って、すべてが簡単に命名されていることです。基本的に、すべてのキーとインデックスには、オブジェクト内のすべてのフィールド名を "-" で区切って連結した1つの文字列の名前が付けられます。つまり、フィールド "fieldA" と "fieldB" に対して1つのインデックスがある場合、XMLDB ファイル内のインデックスは "fieldA-fieldB" という名前になるのです。簡単ですね! | まず知っておいていただきたいのは、[[XMLDB XML構造の定義 (Dev docs)|XMLDB スキーマファイル]] のもとでは、主にいくつかの [[XMLDB XML構造の定義 (Dev docs)#規約|厳密な規則]] に従って、すべてが簡単に命名されていることです。基本的に、すべてのキーとインデックスには、オブジェクト内のすべてのフィールド名を "-" で区切って連結した1つの文字列の名前が付けられます。つまり、フィールド "fieldA" と "fieldB" に対して1つのインデックスがある場合、XMLDB ファイル内のインデックスは "fieldA-fieldB" という名前になるのです。簡単ですね! | ||
しかし、これらの結果の名前は、XMLDB ジェネレータが DB 構造を作成するために使用される最終的な名前にはなりません。そこで、多くの DB アプリケーションで広く使われている、ある命名法に従います: | しかし、これらの結果の名前は、XMLDB ジェネレータが DB 構造を作成するために使用される最終的な名前にはなりません。そこで、多くの DB アプリケーションで広く使われている、ある命名法に従います: | ||
# | # 標準的な命名規則が1つ。 | ||
# | # ある キー/インデックス が何らかのエラーを投げているときに、何が問題なのかを知ることができること。 | ||
# | # 同じ DB で複数の Moodle サーバを動作させることができること。 | ||
また、これらのルールはすべて XMLDB ジェネレータによって自動的に適用されるため、オブジェクトは正しい名前で作成され、そのような名前を直接使用する必要はありませんが、いくつかの特殊な状況下では、そのような名前に注意する必要があります。 | |||
また、RDBMS はそれぞれ名前の最大長に制限を設けています。それらは: | |||
* MySQL: 64 cc. | * MySQL: 64 cc. | ||
20行目: | 20行目: | ||
* MSSQL: 128 cc. | * MSSQL: 128 cc. | ||
そのため、最小の数字が決めるように、30cc 以下ですべての名前を付けられるようにしなければなりません。 | |||
XMLDB コンストラクタ (XMLDB 形式を実際の RDBMS 文に変換できる関数) に実装する形式は、この形式に従うことを提案しています: | |||
<font color="blue">[$CFG->prefix]</font><font color="green">tablename_abbreviated</font>_<font color="blue">columnames_abbreviated</font>_<font color="green">object_type</font> | <font color="blue">[$CFG->prefix]</font><font color="green">tablename_abbreviated</font>_<font color="blue">columnames_abbreviated</font>_<font color="green">object_type</font> | ||
場所: | |||
* '''[$CFG->prefix]''' | * '''[$CFG->prefix]''' は、すべてのオブジェクトに付加するプレフィックスになりますが、Oracle については [[XMLDBの問題 (Dev docs)#命名規則 II|命名規則 II]] を参照してください (30cc という制限に配慮して、このプレフィックスが 4cc より長くならないようにします) 。 | ||
* '''tablename_abbreviated''' | * '''tablename_abbreviated''' はテーブル名の省略形になります。テーブル名を単語に分割し、それぞれの単語の最初の '''4''' 文字を取得して自動的に生成されます。例えば、テーブル "<font color="red">glos</font>sary_<font color="red">entr</font>ies_<font color="red">cate</font>gories" は "<font color="red">glosentrcate</font>" の略号に変換されます。 | ||
* '''columnames_abbreviated''' | * '''columnames_abbreviated''' は、各フィールドの最初の '''3''' 文字を連結した、オブジェクトが使用する列 (インデックス、キー、シーケンス) の省略表現になります。例えば、"<font color="red">nam</font>e, <font color="red">lev</font>el, <font color="red">con</font>text" フィールドの上の1インデックスは "<font color="red">namlevcon</font>" 略号に変換されます。 | ||
* | * '''object_type''' は、作成するオブジェクトのタイプを宣言します。これらのいずれかになります: | ||
** '''pk''': | ** '''pk''': プライマリキーの場合 | ||
** '''uk''': | ** '''uk''': ユニークキーの場合 | ||
** '''fk''': | ** '''fk''': 外部キーの場合 | ||
** '''ck''': | ** '''ck''': チェックコンストレインツの場合 | ||
** '''ix''': | ** '''ix''': インデックスの場合 | ||
** '''uix''': | ** '''uix''': ユニークインデックスの場合 | ||
** '''seq''': | ** '''seq''': シーケンスの場合 | ||
** '''trg''': | ** '''trg''': トリガーの場合 | ||
この名前を計算するメソッドは、すべての XMLDB ジェネレータで共有されるため、すべてのオブジェクトは統一された名前になります。計算された名前が悪名高い 30cc を超えた場合、"columnames_abbreviated" の部分から文字を削除し、完全に収まるまで名前を減らします。 | |||
RDBMS が自動的に生成する名前は一切指定しません。それらは: | |||
* '''sequences''': | * '''sequences''': PostgreSQL の場合、SERIAL キーワードは上で指定したものとは異なる名前のスキーマを持つシーケンスを1つ生成します。 | ||
* '''primary''': | * '''primary''': MySQLの場合、PRIMARY KEYの名前は "primary" でなければなりません (または、デフォルトで名付けられています) 。 | ||
また、これらの名前を手動で 作成/変更 する '''必要がない''' ことも忘れてはいけません。XMLDB レイヤが自動的に生成し、XMLDB エディタで要素に名前を付けるための [[XMLDB XML構造の定義 (Dev docs)#規約|慣例]] とはかなり異なるものとなっています。 | |||
[[カテゴリ:XMLDB]] | [[カテゴリ:XMLDB]] | ||
[[en:development:XMLDB key and index naming]] | [[en:development:XMLDB key and index naming]] |
2023年1月26日 (木) 01:09時点における最新版
XMLDB ドキュメンテーション > XMLDBのキーおよびインデックスの命名
DB 内のオブジェクトにはそれぞれ名前がついています。テーブル名やフィールド名はわかりやすいですが、キー、インデックス、シーケンスなど、わかりにくい名前で作成されているものもあります。このページでは、これらのオブジェクトが XMLDB ジェネレータによって圧縮された方法で命名される方法を少し説明しようと思います。
まず知っておいていただきたいのは、XMLDB スキーマファイル のもとでは、主にいくつかの 厳密な規則 に従って、すべてが簡単に命名されていることです。基本的に、すべてのキーとインデックスには、オブジェクト内のすべてのフィールド名を "-" で区切って連結した1つの文字列の名前が付けられます。つまり、フィールド "fieldA" と "fieldB" に対して1つのインデックスがある場合、XMLDB ファイル内のインデックスは "fieldA-fieldB" という名前になるのです。簡単ですね!
しかし、これらの結果の名前は、XMLDB ジェネレータが DB 構造を作成するために使用される最終的な名前にはなりません。そこで、多くの DB アプリケーションで広く使われている、ある命名法に従います:
- 標準的な命名規則が1つ。
- ある キー/インデックス が何らかのエラーを投げているときに、何が問題なのかを知ることができること。
- 同じ DB で複数の Moodle サーバを動作させることができること。
また、これらのルールはすべて XMLDB ジェネレータによって自動的に適用されるため、オブジェクトは正しい名前で作成され、そのような名前を直接使用する必要はありませんが、いくつかの特殊な状況下では、そのような名前に注意する必要があります。
また、RDBMS はそれぞれ名前の最大長に制限を設けています。それらは:
- MySQL: 64 cc.
- PostgreSQL: 64 cc.
- Oracle: 30 cc.
- MSSQL: 128 cc.
そのため、最小の数字が決めるように、30cc 以下ですべての名前を付けられるようにしなければなりません。
XMLDB コンストラクタ (XMLDB 形式を実際の RDBMS 文に変換できる関数) に実装する形式は、この形式に従うことを提案しています:
[$CFG->prefix]tablename_abbreviated_columnames_abbreviated_object_type
場所:
- [$CFG->prefix] は、すべてのオブジェクトに付加するプレフィックスになりますが、Oracle については 命名規則 II を参照してください (30cc という制限に配慮して、このプレフィックスが 4cc より長くならないようにします) 。
- tablename_abbreviated はテーブル名の省略形になります。テーブル名を単語に分割し、それぞれの単語の最初の 4 文字を取得して自動的に生成されます。例えば、テーブル "glossary_entries_categories" は "glosentrcate" の略号に変換されます。
- columnames_abbreviated は、各フィールドの最初の 3 文字を連結した、オブジェクトが使用する列 (インデックス、キー、シーケンス) の省略表現になります。例えば、"name, level, context" フィールドの上の1インデックスは "namlevcon" 略号に変換されます。
- object_type は、作成するオブジェクトのタイプを宣言します。これらのいずれかになります:
- pk: プライマリキーの場合
- uk: ユニークキーの場合
- fk: 外部キーの場合
- ck: チェックコンストレインツの場合
- ix: インデックスの場合
- uix: ユニークインデックスの場合
- seq: シーケンスの場合
- trg: トリガーの場合
この名前を計算するメソッドは、すべての XMLDB ジェネレータで共有されるため、すべてのオブジェクトは統一された名前になります。計算された名前が悪名高い 30cc を超えた場合、"columnames_abbreviated" の部分から文字を削除し、完全に収まるまで名前を減らします。
RDBMS が自動的に生成する名前は一切指定しません。それらは:
- sequences: PostgreSQL の場合、SERIAL キーワードは上で指定したものとは異なる名前のスキーマを持つシーケンスを1つ生成します。
- primary: MySQLの場合、PRIMARY KEYの名前は "primary" でなければなりません (または、デフォルトで名付けられています) 。
また、これらの名前を手動で 作成/変更 する 必要がない ことも忘れてはいけません。XMLDB レイヤが自動的に生成し、XMLDB エディタで要素に名前を付けるための 慣例 とはかなり異なるものとなっています。