テーブル継承の仕組みについて、教えてください。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
08-04-2021 07:53 PM
テーブル継承の考え方として、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万件が母体となる。
===================================================
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
08-04-2021 10:47 PM
テーブルは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
tableCが持つレコードは、tableA、task から閲覧できます。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
08-10-2021 02:15 PM
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
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
08-10-2021 06:10 PM
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)テーブルなどを見ると分かりやすいかと思います。