内容薄いかもです (^^;)
なぜ調べようと思ったか
- 例として、以下のようなテストを表現する型があるとする
- これらの型を使って、テスト結果の答え合わせをするときに、データを
questionId
でソートすると考える(なお、idは1や2などの数字である) - その際に、
string
型よりもnumber
型の方が比較が楽だと思った - しかしながら、一般的にidは
string
型が良いとされていることに疑問を感じた
型定義
type Test = {
questions: Question[]
answers: Answer[]
}
type Question = {
id: number
content: string //問題文
options: Option[]
}
type Option = {
id: number
content: string //選択肢
}
type Answer = {
questionId: number
correctOptionId: number
}
type UserAnswer = {
questionId: number
selectedOptionId: number
}
答え合わせ
// number型によるソートは、とても簡単である
// [2,10,1]と言う場合にも対応
const sortedAnswers = test.answers.sort((a, b) => a.questionId - b.questionId)
// questionIdがstring型である時のソート
// toString()を使う必要がある
const sortedAnswers2 = test.answers.sort((a, b) => a.questionId.toString() - b.questionId.toString())
先にまとめ
- idにはナチュラルキーとサロゲートキーがある
- string型にするメリットは、IDのフォーマットによる型の問題を回避できること、開発者間での型の統一が容易であること
- 結局は、トレードオフだったり、その時の状況による
そもそもidにも種類が2つあるらしい
1. ナチュラルキー
- ナチュラルキーとは、データそのものが持つ固有の特性や属性から生成される識別子
- 簡単に言うと入力データ自体をPKになる時、それはナチュラルキーとなる
具体例:
種類 | 例 |
---|---|
社員番号 | AA12345678 |
電話番号 | 090-1234-5678 |
メールアドレス | example@example.com |
商品コード | FOOD-1234 |
特徴:
- 実世界の意味を持つ
- データから直接導き出される
- 人間が理解しやすい
- 既存のビジネスプロセスと整合性がある場合が多い
2. サロゲートキー
- サロゲートキー(代理キー)とは、データの内容とは無関係に、システムによって自動生成される人工的な識別子
- あくまでユニークになる連番なので、業務的は意味を持つ値ではない
具体例:
種類 | 例 |
---|---|
自動採番ID | 1, 2, 3, ... |
UUID/GUID | 550e8400-e29b-41d4-a716-446655440000 |
特徴:
- データの内容と無関係
- システムによって自動生成される
- 変更されることがない
- ビジネスルールの変更に影響されない
さらに詳しくは、リンクを参照のこと
idをstring型にするメリット
- number型と比べて表現できる幅が多い
- IDのフォーマットによって型を気にしなくていい
- 開発者間での型の統一が容易で、設計判断が明確化される
考察:
- サロゲートキーにおいては、「1」はそこまでメリットではない
- 2, 3がサロゲートキーにおいてもメリットになるであろう
- チーム間での認識を揃えやすくさせたいのであれば、特に有効であろう
結局はトレードオフだったり、その時の状況による
書いてて感じたのは、「どこに複雑性を持たせるか」が論点になってくる?
例えば、
- IDによって、string型とnumber型の使いやすい方を選ぶ
- メリット:ソートロジックは簡潔で済む
- デメリット:開発者間のコミュニケーションが複雑になる
- IDをstring型で固定する
- メリット:IDのフォーマットによって型を気にしなくていい
- デメリット:ソートロジックが多少複雑になる
自分の場合
- 自分の場合、開発者間でもコミュニケーションが簡潔になる方が、重要だと考える
- そのため、string型にするのが良いと思った
- ただ、今回の例のような
Test
型でquestion
やoption
の数が、せいぜい4~10個とかの場合は、number型でも良い気はする
参考資料