質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

3回答

3558閲覧

CakePHPでユニークなidをURLに使いたい

smnsmn

総合スコア175

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2016/11/11 15:37

CakePHPでidをCHAR(36)に設定するとsave()時にユニークなUUIDを振って保存してくれますが、

これを
http://hoge.com/posts/view/4b1a307c-cfe4-4343-9d06-1094c0a80b06
http://hoge.com/users/mypage/4b1a307c-cfe4-4343-9d06-1094c0a80b06

上は例えば記事idやユーザーidを4b1a307c-cfe4-4343-9d06-1094c0a80b06として、
記事の個別ページやユーザーのマイページの表示に使います。
このように使うのはあまり良くないでしょうか?(そもそも長すぎると思うのですが・・・)

普段は、自分でランダムな英数字10文字を生成する関数を作って、
DBに同じidがなければそれをidとして使っています。

オートインクリメントだと、予測がつきやすいため、あまり使いたくありません。

UUIDは長すぎるので、やはり自分で生成して重複チェックするのが良いでしょうか。
データ件数が数千〜数万になってくるので、新規データを保存するたびに重複チェックを挟むより、
自動でユニークIDを振ってくれる方がいいかなと思うのですが・・・

何か良い方法がありましたらアドバイス頂けると助かります。
何卒よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

シーケンシャルなID に MD5 かけてやればいいんじゃねとおもったけど

TYPEVALUE
UUID4b1a307c-cfe4-4343-9d06-1094c0a80b06
SEQ+MD5c4ca4238a0b923820dcc509a6f75849b
SEQ+SHA1da4b9237bacccdf19c0760cab7aec4a8359010b0

MD5 で暗号化してもいいが 32Bytes ですねぇ

投稿2016/11/12 00:57

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

結論から言えば、データ件数が数万程度なら、UUIDでもランダム英数字10文字でもどちらでも問題ないと思いますよ!!

以下、簡単に違いをまとめ

  • UUIDの場合、Cakephpが自動で生成してくれるので実装が楽。

ただし、URLは長くなる(見た目の問題レベル)。データ長は長いので、外部キーとしてはやや長くなります。ただ、データ量が少なければ大して問題はないと思います。

  • ランダム英数字10文字の場合、自前で実装が必要。重複チェックが必要ですが、インデックス参照なので処理自体は軽い。むしろデータ長が短い分、全体のパフォーマンスはこちらのほうがいいと思います。

独自なので、UUID以上にわかりにくいし、URLも短め。

(追記)

ランダム英数字10文字の場合、delete文を使ってレコードを削除するような処理がある場合、注意が必要かもしれません。というのは連番やUUIDであれば、削除したIDを再利用する可能性はないのですが、ランダムだと削除したIDを再利用される可能性があります。IDを削除したときに外部キーが残っていたりすると間違った関連付けができたりするかもしれません(まぁレアケースですが)。deleteで物理削除しないで、is_deleteカラムを1にする(論理削除)などのやり方もあるかもしれません。

投稿2016/11/12 00:22

編集2016/11/12 07:32
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

smnsmn

2016/11/14 03:46

やはり実装が楽なのでCakePHPによる自動生成に頼りたい気持ちがあるのですが、 >ただし、URLは長くなる(見た目の問題レベル)。データ長は長いので、外部キーとしてはやや長くなります。ただ、データ量が少なければ大して問題はないと思います。 ほぼ見た目の問題なのですね・・・長すぎるんですよね・・・ >自前で実装が必要。重複チェックが必要ですが、インデックス参照なので処理自体は軽い。むしろデータ長が短い分、全体のパフォーマンスはこちらのほうがいいと思います。 自前実装と重複チェックが億劫なのですが、パフォーマンス面を見るならはやり自分で実装するほうがよさそう(URLが長くなりすぎる件においても)ですね。。。 できるならシステムに任せたい気持ちも捨てきれないですが、もう少し考えて見たいと思います。 いつも解答ありがとうございます。 とても参考になります。m(__)m
popobot

2016/11/14 04:01

個人的な見解ですが... そもそもIDは連番でいい気がしますけどね。ランダム文字列にすると、確かにIDの予想はつきにくくなりますが、セキュリティ的には別に大差ないと思いますよ。どうせURLとかに使われて、オモテに表示される値ですし。
guest

0

膨大なID管理にならなければ、自分のロジックで生成して重複確認ができて、重複しなければ発行、重複していたら再度生成、重複確認で良いのでは?(DBは必須でしょうが)なおDBのキーに生成コードを指定すれば、存在確認だけで重複確認できますね。

投稿2016/11/11 15:45

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

smnsmn

2016/11/14 03:40

>DBのキーに生成コードを指定すれば、存在確認だけで重複確認できますね。 なるほど、たしかにそうですね。 勉強になります。ありがとうございますm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問