
タグはなぜテーブルをまたいで貼れるか(label)
ServiceNow のリストやフォームを触っていると、レコードに色付きの付箋(タグ)を貼って、後から「自分が見るべきものだけ」を素早く呼び出せることに気づきます。インシデントでもナレッジでも、種類の違うレコードに同じ感覚でラベルを貼れます。この「付箋のように貼るタグ」を支えているのが label(タグの定義) と label_entry(タグの貼り付け1件) という2つのテーブルです。
この記事は、タグを使ったことはあるが、それがどんなテーブルにどう保存され、なぜテーブルをまたいで貼れるのかを知りたい管理者・開発者を想定しています。PDI(Zurich / OOTB)で label と label_entry を実際に開きます。タグ定義と貼り付けが別テーブルに分かれていること、table+table_key で任意のレコードを指す多態(polymorphic)m2m であることを確認します。そして viewable_by による共有範囲も順に確認します。
この記事で分かること
タグは label(定義)と label_entry(貼り付け)の2テーブルに分かれて保存されること
label_entry が label への参照+table+table_key で、どのテーブルのどのレコードにもタグを貼れる多態m2mであること
共有範囲を決める viewable_by(Me / Groups and Users / Everyone) の意味
PDI 実機の label 32件・label_entry 16件が、4種類の異なるテーブルにまたがって貼られていること
1レコードに複数タグ/1タグが複数レコードという多対多が実データで成り立つこと
この記事の内容は ServiceNow の PDI(Personal Developer Instance)Zurich(ズーリッヒ)リリースの OOTB(初期設定)で確認した個人メモです。本番環境やカスタマイズ済み環境では、フィールド・選択肢・タグの内容が異なる場合があります。
タグの定義テーブル label とは
label は、タグそのものを1行=1レコードで定義するテーブルです。たとえば「Java」「Development」「Most Active」といったタグ名が、それぞれ label の1行になっています。下の実画面は、タグ「Java」の定義フォームです。

label が持つのは、おもに name(タグ名)・viewable_by(共有範囲)・owner(作成者)・color(色) です。label には「どのレコードに貼ったか」の情報が入っていません。タグの定義と、貼り付けの事実は、別のテーブルに分けて管理されています。

PDI(Zurich / OOTB)の label には、すでに 32件のタグが入っていました。
label_entry:どのレコードに貼ったかを多態で持つ
「タグをどのレコードに貼ったか」を1件ずつ保存するのが label_entry です。タグがテーブルをまたいで貼れる理由は、このテーブルの設計にあります。

label_entry の1行は、label(どのタグか) を持ちます。加えて、table(対象レコードのテーブル名) と table_key(対象レコードの sys_id) も持ちます。普通の参照(reference)フィールドは1つのテーブルしか指せません。label_entry は「テーブル名+sys_id」を文字列で持つことで、どのテーブルのレコードでも指せます。これが多態(polymorphic)参照です。

辞書(sys_dictionary)で label_entry のフィールドを開きます。table が Table name 型、table_key が String 型として並んでいるのが確認できます。

実際の label_entry を一覧で開くと、1行ごとに table と table_key が違うレコードを指していることが分かります。

共有範囲を決める viewable_by
label には viewable_by というフィールドがあり、そのタグを誰が見えるかを決めます。選択肢は3つです。

Me:作成者(owner)だけが見える個人用タグ。「Most Active」「Most Recent」のような自分用の付箋がこれです。
Groups and Users:指定した group_list / user_list のメンバーだけが見える、チーム共有タグ。
Everyone:全員が見える共通タグ。「Java」「Development」のような全社的な分類がこれです。
つまり、同じタグの仕組みで「自分専用の付箋」と「全社共通の分類」を両立できる設計です。これは テンプレート(sys_template) や 保存フィルタ(sys_filter) と同じ「個人/グループ/全体」の共有モデルです。ServiceNow の各所で繰り返し出てくる考え方です。
PDI 実機の数字:32タグが4テーブルにまたがる
実機の数字を見ると、タグの横断性がよく分かります。label を viewable_by の順で並べ、label_entry を table でグループ化しました。



label 32件のうち Everyone が18件、Me が9件で、全社共通タグと個人タグが大半でした。そして label_entry 16件は、4テーブルにまたがっていました。ナレッジ(kb_knowledge)・社内Q&A(kb_social_qa_question)・スキャンスイート(scan_check_suite)・UIデータセット(sys_ux_composite_data)の4つです。1つの label_entry テーブルが、まったく別系統のテーブルのレコードを同じ形で指しています。これが多態の実証です。
多対多(m2m)であることの確認
タグとレコードの関係は、多対多(m2m)です。label_entry を間にはさむことで、両方向に「複数」が成り立ちます。

実データでも、ある社内Q&Aレコード1件に Development / Java / JavaScript / Android の4つのタグが貼られていました。同時に「Java」タグは、その Q&A とナレッジ記事 KB0010001 の両方に貼られていました。
1レコードに複数タグ:1件のレコードに何枚でも付箋を貼れる。
1タグが複数レコード:1つのタグを、テーブルが違っても何件にでも貼れる。
この多対多を、CI 関連のような専用の関連テーブルではなく、汎用の label_entry 1枚(table+table_key 多態)で実現しているのがタグの特徴です。
実機で確認するときに見るべきURL
最後に、今回見た画面を自分のインスタンスで開くためのURLをまとめます(<YourInstance> は置き換えてください)。
# タグ定義の一覧(共有範囲で並べる)
https://<YourInstance>/label_list.do?sysparm_query=ORDERBYviewable_by
# タグの貼り付け一覧(テーブルでグループ化)
https://<YourInstance>/label_entry_list.do?sysparm_query=GROUPBYtable
# label_entry のフィールド定義
https://<YourInstance>/sys_dictionary_list.do?sysparm_query=name=label_entry^elementISNOTEMPTYまとめ
タグは label(定義)と label_entry(貼り付け)の2テーブルに分かれている。label にはタグ名・共有範囲・色だけがあり、貼り付け先は持たない。
label_entry は label 参照+table+table_key の多態で、任意のテーブルのどのレコードにもタグを貼れる。
viewable_by(Me / Groups and Users / Everyone) で、個人用の付箋から全社共通の分類までを同じ仕組みで使い分ける。
PDI 実機では label 32件・label_entry 16件で、貼り付けは 4種類のテーブルにまたがり、1レコード複数タグ・1タグ複数レコードの多対多が成り立っていた。
タグの仕組みが分かると、リストと関連リスト・テンプレート(sys_template)・保存フィルタ(sys_filter)・テーブルとフィールド(sys_db_object / sys_dictionary)という「UIから個人の使い勝手を支える仕組み」が、ひとつながりに見えてきます。
関連記事
ServiceNow 画面・フォーム完全ガイド:どこを直せば見た目が変わるのか — タグは画面の一角に付箋のように表示される小さなUI要素です。画面全体でどこを直せば見た目が変わるのかを知りたい人はこちらから探せます。