SlideShare uma empresa Scribd logo
1 de 18
Baixar para ler offline
シュードキー・ニートフリーク
(疑似キー潔癖性)
Twitter: @a_suenami
Github: a-suenami
id: a_suenami
自己紹介
• 末並晃(すえなみあきら)
• @a_suenami
• 髪切りました
• RubyとかPHPとかJavaScriptとか
• いわゆる”Web系”エンジニア
• どちらかというと自然キー/複合キー容認派
• どちらかというとNULL撲滅したい派
こういうのが気になる!!
シュードキー・ニートフリーク(疑似キー潔癖性)とは
• 目的
• 欠番があることの不安を解消するため、欠番を詰める
• 誤ってデータを削除してしまったのか
• 欠番が生じたことの責任をとらされるのではないか
• アンチパターン
• 間を埋める
• 欠番割り当てと番号振り直し
シュードキー・ニートフリーク(疑似キー潔癖性)とは
欠番の割り当て
• 新しい行の挿入時に、欠番番号のうち最も小さい番号を割り当てる
方法
• RDBMS自体の自動採番メカニズムを使わず、独自の自己結合クエリ
を利用する必要がある
• 複数の挿入が同時に実行された場合、同じ番号を割り当ててしまう
可能性がある(その場合、片方がエラーになる)
番号振り直し
• 欠番をすぐに埋めたい場合に、最大の番号を持つ行に最小の欠番を
割り当てる
• UPDATE Bugs SET bug_id = [最小番号] WHERE bug_id = [最大
番号]
• 主キーが変更されるため、参照先のテーブルの外部キーも変更する
必要がある
外部システムからの参照
• 外部システムからデータが参照されている場合、主キーが変更され
ると参照できなくなってしまう
• 使用されてないからといって、疑似キーを再利用してはならない
• 退会した会員かも?
• 生産中止になった商品かも?
アンチパターンの見つけ方
• 「挿入をロールバックした後で、自動生成された ID 値を再利用する
にはどうすればいい?」
• 「bug_id の 4 番に何が起こったの?」
• 「使用されていない最初の ID を取得するクエリはどうやって書いた
らいい?」
• 「番号が足らなくなったらどうしよう?」
@a_suenami の体験談
「次年度、事業部再編があるので
データの修正をお願いしたいんですが…」
!?
※画像はイメージであり、実際に受領したファイルとは異なります。データも架空のものです。
@a_suenami の体験談
この件は画面上の表示順の問題だったので、
以下のように対応しました…
ALTER TABLE departments ADD display_order INTEGR NOT NULL DEFAULT 1;
レポートには ID を出力しないようにもしました…
アンチパターンを用いてもよい場合
• 疑似キーの変更を正当化する理由は存在しない
• 疑似キーの値そのものが意味を持つべきではない
• 主キーが何らかの意味を持っているのであれば、それは自然キー
である可能性を疑うべき
解決策
• 行のナンバリング
• GUID(UUID)の使用
• コミュニケーション
• 技術的な説明
• コスト見積もり
• 自然キーの利用
行のナンバリング
• 疑似キーは単調増加する整数値のため、行番号と同等に見える
• しかし、主キーは行を一意に特定するためのもの、行番号は結果
セットの行の順序であり、役割が明確に異なる
• 主キーを行番号として利用してはいけない
• 行番号(結果セットを特定の範囲に限定する場合等)は行番号を使
う必要がある
• Window 関数の ROW_NUMBER()
• LIMIT, OFFSET
GUID(UUID)の使用
• GUID とは 128 ビットの擬似乱数
• 単調増加の整数値ではないので誰も順番を気にしなくなる
• グローバルで一意な値である(それだけランダム性が高く、キー長
が長い)ため、並列性も高くスケールアウト可能
• ディスクやインデックスの空間効率はシーケンシャルな ID には劣る
のでその点は注意が必要
例: PostgreSQL で UUID を利用する
sqlap=# dx
List of installed extensions
Name ¦ Version ¦ Schema ¦ Description
---------+---------+------------+------------------------------
plpgsql ¦ 1.0 ¦ pg_catalog ¦ PL/pgSQL procedural language
(1 row)
!
sqlap=# CREATE EXTENSION "uuid-ossp";
CREATE EXTENSION
sqlap=# dx
List of installed extensions
Name ¦ Version ¦ Schema ¦ Description
-----------+---------+------------+-------------------------------------------------
plpgsql ¦ 1.0 ¦ pg_catalog ¦ PL/pgSQL procedural language
uuid-ossp ¦ 1.0 ¦ public ¦ generate universally unique identifiers (UUIDs)
(2 rows)
!
sqlap=# select uuid_generate_v4();
uuid_generate_v4
--------------------------------------
2a0ee3d7-76ab-46d7-b18b-ff09b030b47a
(1 row)
例: PostgreSQL で UUID を利用する
sqlap=# create table t (id uuid primary key default uuid_generate_v4(), name varchar(255) not null default
'');
CREATE TABLE
sqlap=# d t
Table "public.t"
Column ¦ Type ¦ Modifiers
--------+------------------------+----------------------------------------
id ¦ uuid ¦ not null default uuid_generate_v4()
name ¦ character varying(255) ¦ not null default ''::character varying
Indexes:
"t_pkey" PRIMARY KEY, btree (id)
!
sqlap=# insert into t (name) values ('Akira SUENAMI');
INSERT 0 1
sqlap=# select * from t ;
id ¦ name
--------------------------------------+---------------
0a2a7944-8dfe-4e53-8376-d659645f0d30 ¦ Akira SUENAMI
(1 row)
コミュニケーションの問題
• 最も重要なのは主キーを変更としたいという要求に対して、きちん
と説明し、納得してもらうこと
• 欠番の存在はシステムに害はなく、安全な採番機構を使っている限
り当然生じるものであるという事実をきちんと伝える
• 主キーを変更することがどれだけ大変でリスクを伴うものかを説明
するためにコストの見積もりを提示する
• それでも主キーの変更が必要なのであればそれは自然キーであるた
め、その文脈でコミュニケーションをする
まとめ
主キーはとても大事だから
ちゃんと考えて使いましょう!!

Mais conteúdo relacionado

Mais de Akira Suenami

糖質とプログラミングと私
糖質とプログラミングと私糖質とプログラミングと私
糖質とプログラミングと私Akira Suenami
 
糖質制限超入門
糖質制限超入門糖質制限超入門
糖質制限超入門Akira Suenami
 
今年かかった麻疹まとめ2014
今年かかった麻疹まとめ2014今年かかった麻疹まとめ2014
今年かかった麻疹まとめ2014Akira Suenami
 
マジックビーンズ
マジックビーンズマジックビーンズ
マジックビーンズAkira Suenami
 
Symfony温泉2014 自己紹介LT
Symfony温泉2014 自己紹介LTSymfony温泉2014 自己紹介LT
Symfony温泉2014 自己紹介LTAkira Suenami
 
Tdd is really dead ?
Tdd is really dead ?Tdd is really dead ?
Tdd is really dead ?Akira Suenami
 
Wip prをやってみた
Wip prをやってみたWip prをやってみた
Wip prをやってみたAkira Suenami
 
俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かう俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かうAkira Suenami
 
今年かかった麻疹まとめ
今年かかった麻疹まとめ今年かかった麻疹まとめ
今年かかった麻疹まとめAkira Suenami
 
デザイナのためのGit講座
デザイナのためのGit講座デザイナのためのGit講座
デザイナのためのGit講座Akira Suenami
 
アジャイル開発振り返り
アジャイル開発振り返りアジャイル開発振り返り
アジャイル開発振り返りAkira Suenami
 
Xp祭りに行ってきた
Xp祭りに行ってきたXp祭りに行ってきた
Xp祭りに行ってきたAkira Suenami
 
テストとの上手な付き合い方
テストとの上手な付き合い方テストとの上手な付き合い方
テストとの上手な付き合い方Akira Suenami
 

Mais de Akira Suenami (13)

糖質とプログラミングと私
糖質とプログラミングと私糖質とプログラミングと私
糖質とプログラミングと私
 
糖質制限超入門
糖質制限超入門糖質制限超入門
糖質制限超入門
 
今年かかった麻疹まとめ2014
今年かかった麻疹まとめ2014今年かかった麻疹まとめ2014
今年かかった麻疹まとめ2014
 
マジックビーンズ
マジックビーンズマジックビーンズ
マジックビーンズ
 
Symfony温泉2014 自己紹介LT
Symfony温泉2014 自己紹介LTSymfony温泉2014 自己紹介LT
Symfony温泉2014 自己紹介LT
 
Tdd is really dead ?
Tdd is really dead ?Tdd is really dead ?
Tdd is really dead ?
 
Wip prをやってみた
Wip prをやってみたWip prをやってみた
Wip prをやってみた
 
俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かう俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かう
 
今年かかった麻疹まとめ
今年かかった麻疹まとめ今年かかった麻疹まとめ
今年かかった麻疹まとめ
 
デザイナのためのGit講座
デザイナのためのGit講座デザイナのためのGit講座
デザイナのためのGit講座
 
アジャイル開発振り返り
アジャイル開発振り返りアジャイル開発振り返り
アジャイル開発振り返り
 
Xp祭りに行ってきた
Xp祭りに行ってきたXp祭りに行ってきた
Xp祭りに行ってきた
 
テストとの上手な付き合い方
テストとの上手な付き合い方テストとの上手な付き合い方
テストとの上手な付き合い方
 

Último

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 

Último (9)

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 

シュードキーニートフリーク