0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IDをnumberではなくstringにする理由を考えた

Posted at

内容薄いかもです (^^;)

なぜ調べようと思ったか

  • 例として、以下のようなテストを表現する型があるとする
  • これらの型を使って、テスト結果の答え合わせをするときに、データを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型にするメリット

  1. number型と比べて表現できる幅が多い
  2. IDのフォーマットによって型を気にしなくていい
  3. 開発者間での型の統一が容易で、設計判断が明確化される

考察:

  • サロゲートキーにおいては、「1」はそこまでメリットではない
  • 2, 3がサロゲートキーにおいてもメリットになるであろう
  • チーム間での認識を揃えやすくさせたいのであれば、特に有効であろう

結局はトレードオフだったり、その時の状況による

書いてて感じたのは、「どこに複雑性を持たせるか」が論点になってくる?
例えば、

  • IDによって、string型とnumber型の使いやすい方を選ぶ
    • メリット:ソートロジックは簡潔で済む
    • デメリット:開発者間のコミュニケーションが複雑になる
  • IDをstring型で固定する
    • メリット:IDのフォーマットによって型を気にしなくていい
    • デメリット:ソートロジックが多少複雑になる

自分の場合

  • 自分の場合、開発者間でもコミュニケーションが簡潔になる方が、重要だと考える
  • そのため、string型にするのが良いと思った
  • ただ、今回の例のようなTest型でquestionoptionの数が、せいぜい4~10個とかの場合は、number型でも良い気はする

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?