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?

【豆知識】なぜunique: trueを追記するのか?

Last updated at Posted at 2024-08-17

はじめに

学習過程において「一意」という日本語が「?」でした。この言葉と出会ったのがunique: trueというコードを知った時です。このコードは一体どのような意味なのか?追記することの利点は何なのか。調べたことをアウトプットしたいと思います。

環境

  • Windows, WSL
  • Docker
  • Ruby 3.2.3
  • Rails 7.1.3

unique: trueはどういうものか

unique: trueは、データベースのテーブルやフィールドに設定するオプションになります。このオプションを付けるメリットや特徴、例は以下の通りです。

【メリット・特徴】

重複値の防止: 同じ値が複数存在することを許さないから、データの整合性が保たれる。
検索性能の向上: ユニークな値が保証されることで、インデックスが効率的に利用される。
エラーの早期発見: 重複したデータを挿入しようとするとエラーが発生するため、早めに問題がわかる。

【簡単な例】

  1. ユーザーのメールアドレス
    • email: { type: String, unique: true }
    • 同じメールアドレスのユーザー登録を防ぐ。
  2. 商品コード
    • product_code: { type: String, unique: true }
    • 同じ商品コードを持つ商品が存在しないようにする。
  3. IDフィールド
    • user_id: { type: Number, unique: true }
    • 各ユーザーに一意のIDを持たせ、重複を防ぐ。
  4. 投稿のタイトル
    • title: { type: String, unique: true }
    • 同じタイトルの投稿が複数できないようにする。
  5. ライセンスキー
    • license_key: { type: String, unique: true }
    • 同じライセンスキーが複数のユーザーに割り当てられないようにする。

追記しない場合と追記する場合の違い

  • 追記しない場合: 例えば、ユーザーのメールアドレスが重複して登録できてしまう。これにより、同じメールアドレスを持つ複数のアカウントが存在することになり、ログインや通知の際に混乱が生じる可能性がある
  • 追記する場合: ユーザーが登録しようとした際に、既に存在するメールアドレスであればエラーが返され、登録が拒否される。これにより、データの整合性が保たれ、ユーザー体験も向上する

私が課題の中で遭遇したunique: trueについて

パスワードリセットに関する機能で、作成されたマイグレーションファイルのコードにはunique: trueが含まれていませんでした。
内容は、users テーブルに reset_password_token カラムのインデックスを追加するためのものですが、このままだと上記で説明したように他のユーザーが同じトークンを持つことになってしまいます

変更前
class SorceryResetPassword < ActiveRecord::Migration[7.1]
  def change
    add_column :users, :reset_password_token, :string, default: nil
    add_column :users, :reset_password_token_expires_at, :datetime, default: nil
    add_column :users, :reset_password_email_sent_at, :datetime, default: nil
    add_column :users, :access_count_to_reset_password_page, :integer, default: 0

    add_index :users, :reset_password_token
  end
end


変更箇所
    add_index :users, :reset_password_token, unique: true
  • 一意のインデックスを追加することで、データの整合性が保証され、複数のユーザーが同じトークンを持つことによる混乱を防ぐことが可能となりました!

最後に

プログラミングを学習していく中で、コードの意味が分からなくてつまずくことはもちろんありますが、それ以前に日本語で躓いてしまうことがあるので、わからない今がチャンスと思い、すべて暗記は難しいですが、「確か、こんな意味だった・・・」レベルまでには到達したいもの。いや到達する!
今回の記事が何か参考になれば幸いです。

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?