テーブル継承の仕組みについて、教えてください。

Toshi7
Tera Contributor

テーブル継承の考え方として、taskテーブルをtableAとtableBが継承する場合、以下のような仕組みだと考えていますが、正しいでしょうか?

===================================================
task(30万レコード)の論理イメージ

a b c d e

tableA(100万レコード)はtaskテーブルの[a][b]を継承する。

a b f g h i

tableB(250万レコード)はtaskテーブルの[a][c]を継承する。

a c j k

の場合、taskの物理的な格納状況は

a b c d e f g h i j k

となり、レコード数は30万+100万+250万=380万件となる。

tableAを検索する場合は100万件を検索母体にするのではなく、380万件が母体となる。
===================================================


3件の返信3

shichitani
Mega Contributor

テーブルはServiceNow上ではアプリケーションクラスの一つなので、
テーブル継承はプログラミングでいうところのクラス継承の考え方とほぼ同じ認識で、
レコードを継承しているわけではありません。

例えば、親テーブル taskに以下のフィールド定義があった場合、
 Field1(string), Field2(choice), Field3(reference) 
子テーブル tableA、Bは上記のフィールド定義を利用できます。(=tableA、B作成時にデフォルトで存在)
各フィールドのChoice、referenceも同じ値を使用できますし、tableA、B個別にChoice、reference値も定義できます。
また、tableA、Bで個別にフィールド定義を追加できます。

逆に子テーブルで定義したフィールド定義を親は利用することが出来ません。
このようにプログラミングでの継承と同じ挙動をします。


また、書かれているテーブル継承におけるレコードの取り扱いはちょっと違います。

物理レコードは基本的に親テーブル(この場合task)のレコードを子テーブルは参照できません。
ですので、書いて頂いた例で改めて表現すると、

===================================================
[親]
・task(物理30万レコード)
 テーブル上のレコード:abcde

[子]※taskテーブルを継承したテーブル
・tableA(物理100万レコード)
 テーブル上のレコード:fghi

・tableB(物理250万レコード)
 テーブル上のレコード:jk


論理的なレコード参照(各テーブルをGlideRecordして取得できるレコード)は、以下になります。

・task(380万レコード)
 閲覧できるレコード:abcdefghijk

・tableA(100万レコード)
 閲覧できるレコード:fghi

・tableB(250万レコード)
 閲覧できるレコード:jk

===================================================
 
もし、上記のレコード状態で、新たに tableAを継承して tableCを作成した場合、
tableCが持つレコードは、tableA、task から閲覧できます。

Toshi7
Tera Contributor

shichitaniさん
詳しいご説明ありがとうございます。

>子テーブル tableA、Bは上記のフィールド定義を利用できます。(=tableA、B作成時にデフォルトで存在)
>各フィールドのChoice、referenceも同じ値を使用できますし、tableA、B個別にChoice、reference値も定義できます。
>また、tableA、Bで個別にフィールド定義を追加できます。

>逆に子テーブルで定義したフィールド定義を親は利用することが出来ません。

に従うと、論理的なレコード参照は、以下になると理解したのですが、理解に誤りがありますでしょうか。

・task(380万レコード)
 閲覧できるレコード:abcdefghijk→abcde

・tableA(100万レコード)
 閲覧できるレコード:fghi→abfghi

・tableB(250万レコード)
 閲覧できるレコード:jk→acjk

 

 

toshiさんの言っている「レコード」がテーブルの「フィールド」だと理解して回答します。
※テーブルが保持しているデータ(=レコード)、テーブルの列(=フィールド)です。

上記の認識で間違いないなら、改めて書き直すと以下です。
--------------------------------
・task(閲覧できるレコード:380万[task+tableA+tableB])
 列:abcde

・tableA(閲覧できるレコード:100万)
 taskの[a][b]列を継承
 列:ab fghi

・tableB(閲覧できるレコード:250万)
 taskの[a][c]列を継承
 列(継承含む):ac jk

※厳密には、子テーブル(taskA、B)には親テーブルのすべてのフィールドは継承されるので、
 子テーブルの設定で非表示にすることになります。

--------------------------------

ServiceNow のOOTBだと、構成管理(cmdb)テーブルなどを見ると分かりやすいかと思います。

find_real_file.png