メインコンテンツへスキップ
見出し画像

タグはなぜテーブルをまたいで貼れるか(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のPDI(Personal Developer Instance)を実機で観察して、Noteに記事を書いています 実装・運用・教育の現場視点で淡々と記録中です リクエストがあればその記事も書きます 個人の観察日記です

    あなたへのおすすめ