ID重複を調べる仕組みとは?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Nekonami
記事: 21
登録日時: 10年前

ID重複を調べる仕組みとは?

#1

投稿記事 by Nekonami » 10年前

こんばんは。気になったことがあったので質問させていただきます。
よくSNSやこの質問サイトなどはID(ユーザー名)を使って個人を識別していますよね?
そのようなwebサイトでアカウントを作るときには必ず「このIDは使用できます」や
「このIDは既に使用されています」と、他の人とIDが重複しないようにチェックされています。
これはどのようにして調べているのでしょうか?検索と似ている気がしますが、どうなんでしょうか?

漠然とした質問ですが、具体的にどうなっているか教えていただけるとありがたいです。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: ID重複を調べる仕組みとは?

#2

投稿記事 by YuO » 10年前

ユーザーは通常RDBMSで管理されています。
なので,

コード:

CREATE TABLE user
(
    internal_id INT NOT NULL UNIQUE,
    login_id VARCHAR(64) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    user_name VARCHAR(64) NOT NULL UNIQUE,
    PRIMARY KEY ( internal_id )
)
のようなテーブルを用意して,

コード:

SELECT COUNT(*) FROM user WHERE login_id=:login_id
のようなSQLを発行し,戻りが1以上なら重複している,という調査ができます。
当然,INSERTとの間でトランザクションに含める必要がありますが。
なお,:login_idはプレースホルダのつもりです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ID重複を調べる仕組みとは?

#3

投稿記事 by softya(ソフト屋) » 10年前

YuO さんの例だとUNIQUEとして定義されているので、重複するIDを登録しようとした時に多重登録でエラーが帰るので、それをチェックするという手もあります。
※ これ業務的にはトランザクションで不味い手なのかな? 業務でSQLを使ったことがないで心配になった。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

rascal
記事: 27
登録日時: 10年前

Re: ID重複を調べる仕組みとは?

#4

投稿記事 by rascal » 10年前

こんばんは
まず基本的にWEBやSNSでのIDを作成し登録するという業務には
データベースおよび疑似データベースが利用されています
疑似データベースというのは TXTファイルにデータベースのような保存方式で保存しプログラム側でデータベースのように扱うということです
WEB上で動作するPHPやJAVA CGIなどによって基本的にはデータベースとWEB上で記入されたIDとの一致を検索し 一致したら「すでに登録されています」等の
メッセージを表示し再度入力を求める という作業になります
一致しなかった場合に使用できますと表示させ登録処理を行う という形になります

データベースでの検索方法はYuOさんが記載していただいたいるようなかたちで CGIやPHPなどWEB上での動作するアプリケーションでSQL文を
発行し実行すると結果が返ってくる という形になります

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: ID重複を調べる仕組みとは?

#5

投稿記事 by YuO » 10年前

softya(ソフト屋) さんが書きました:YuO さんの例だとUNIQUEとして定義されているので、重複するIDを登録しようとした時に多重登録でエラーが帰るので、それをチェックするという手もあります。
※ これ業務的にはトランザクションで不味い手なのかな? 業務でSQLを使ったことがないで心配になった。
重複であることを検出することが,RDBMSの製品依存になるので避けています。
つまり,一意性制約違反を検出するには,RDBMSのエラーコードを製品毎に知っておく必要があります。

PDOでもJDBCでもADO.NETでもそうなのですが,これらの抽象化層はRDBMSの製品依存性をドライバという形である程度隠蔽してくれます。
DDLなどで依存性が出てくるのは仕方がないですが,正常系の中に,回避策があるにも関わらず製品依存性のあるコードを入れると,RDBMSの製品変更があとから面倒になります。
# エラーコードはMySQLなら1062,SQL Serverなら2627。

あと,制約違反は通常例外として検出されますが,一意性制約違反だけを処理してそれ以外は再投入,のようなコードを書くのは,例外の意義を潰す気がしますし。
オフトピック
大抵,制約違反は前もって潰すことが多いですね。
ユーザー名のような物はユーザーに一意性違反であること」をユーザーに通知する必要があるのでチェックしますし,
外部参照制約はユーザーに対してリストの形で提示して,制約違反を起きないように入力させます。
プログラム中では当然制約自体が要件なので,制約に沿うよう作りますし。

制約の設定は,ドキュメントだと割り切ってしまうのも一つだと思います。
ちなみに,phpBBはPHP5より前をサポートしているのでPDOは使わずに自前で抽象化層を持っています。
そして,phpBB 3.0.12のコードを見ると,includes/functions_user.phpのvalidate_username関数の中で,
  • 既存ユーザー名 (1513行目~1523行目)
  • 既存グループ名 (1525行目~1535行目)
との照合を行っています。

phpBBはPHPで書かれているのでダウンロードすればコードを見ることができます。中を見てみるのもよいのではないでしょうか>Nekonamiさん
# 読むには面倒臭いコードですが……。

Nekonami
記事: 21
登録日時: 10年前

Re: ID重複を調べる仕組みとは?

#6

投稿記事 by Nekonami » 10年前

ありがとうございます。

RDBMSなんてものがあったんですね。自分でも調べてみようと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る