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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

Q&A

解決済

2回答

1269閲覧

Twitterがサロゲートキーを使う理由

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

0グッド

0クリップ

投稿2019/05/05 08:31

編集2019/05/05 09:04

DBの初学者です。Twitterのようなサービスではユーザ名とペアになるサロゲートキーは不要と考えてもよいでしょうか?
(訂正:本文でTwitterのユーザ名は「変更不可」と誤解しておりましたが、実際はユーザ名も変更可能でした。)

詳細

Twitterのユーザ名は**「変更不可、長さ15文字まで。英数字(文字A~Z、数字0~9)とアンダースコアのみ利用可」**です。この条件ならユーザ名をナチュラルキーとして利用できるので、サロゲートキーは不要だと考えましたが、実際はどうなのでしょうか?
(こちらの資料で、つぶやきテーブルにユーザ名の代わりにサロゲートキーを利用しているようでした)

論点1
Twitterのアカウント数上限をスパムアカウントなども考慮して100億程度とする。例えばmysqlではBIGINTを使う必要があり8バイト必要。一方user名はアスキー文字で最大15文字なので、VARCHAR(15)で最大16バイト?となるが、1文字のユーザ名は2バイト?である。8バイト vs 2〜16バイトなら両者のサイズ差は無視できるのではないか?
(他テーブルのインデックスにも利用されるのでユーザ数が莫大なことを考えると実は無視できない?実際どうなのでしょうか?)

論点2
https://twitter.com/a のように、個人ページのurlに本人のidが含まれるが、このページで表示されるつぶやき一覧を取得するために、わざわざユーザ名からサロゲートキーを取得し、サロゲートキーでつぶやき一覧を取得するコードが必要なため複雑になる。

補足
Twitterがサロゲートキーを採用した理由はrailsを利用していたことや、将来のユーザ名変更にも対応できる柔軟性のためかもしれません。
本投稿では単純化のため、フレームワークの都合や将来のユーザ名の変更は無視できるものとして、これからTwitterのようなサービスを作る場合、ユニークなユーザ名とペアになるサロゲートキーをつけた方が良いかどうか?という疑問です。

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

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

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

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

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

guest

回答2

0

ベストアンサー

将来のユーザ名変更にも対応できる柔軟性のためかもしれません

すでにTwitterのスクリーンネームは変更可能です。

また,この都合は無視すると書いてありますが,「Twitterのようなサービス」であればスクリーンネームは変更可能であるほうが大きく融通が効くため,これを無視した議論はそもそも本質的ではないと思います。単純化以前の問題ですね。

論点1

無視できると思います。

論点2

フレームワークを使っている以上はまずユーザオブジェクトの取得はほぼ確定で入ると思います。サロゲートキーを使っていても使っていなくても

SELECT * FROM users WHERE ...
SELECT * FROM statuses WHERE user_id = ?

の2クエリは必ず発生するでしょう。またこれがフレームワークの都合で必要でなかったとしても,ユーザタイムラインの取得以外にもさまざまな認可処理が発生するため,ユーザテーブルへのアクセスは事実上不可欠でしょう。

結論としては,ほとんどのWebサービスではサロゲートキーは必要です。ナチュラルキーは理論上使える・使ったほうが望ましいと言える場面はあるかもしれませんが,総合的な運用を考えるとサロゲートキーは不可欠です。データベースの理論と実際のWebサービス構築ノウハウにはギャップはあると思います。

投稿2019/05/05 08:50

mpyw

総合スコア5223

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

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

退会済みユーザー

退会済みユーザー

2019/05/05 08:57

丁寧なご説明ありがとうざいます! すみません、私の表現力が足りていなかったのですが、スクリーンネームとは別のユーザ名については公式ページで変更不可と説明されているように思います。 https://help.twitter.com/ja/managing-your-account/twitter-username-rules 私の理解が間違っていなければユーザ名の変更は不可だと思うのですが、その場合でも実運用ではサロゲートキーは利用したほうがよい場合が多いというお考えでしょうか?
退会済みユーザー

退会済みユーザー

2019/05/05 08:58

重ねてすみません。 ユーザ名は変更できるみたいですね。本当にすみません!
mpyw

2019/05/05 08:59

スクリーンネームはこちらから変更可能です。 https://twitter.com/settings/account 「スクリーンネームとは別のユーザ名」が何を指しているのかわかりません,リンク先を見て「変更」でページ内検索してみても何も見当たりません…
mpyw

2019/05/05 09:00

あ,入れ違いでしたね…
mpyw

2019/05/05 09:00

>> その場合でも実運用ではサロゲートキーは利用したほうがよい ですね。
退会済みユーザー

退会済みユーザー

2019/05/05 09:15

ありがとうざいます! フレームワークを使わずに勉強しながらTwitter形式のスキーマを考えていたのですが、今回の自分の勘違いのように、あるいは何かしらの理由でユーザ名を変更する可能性が万が一にもある場合には、サロゲートキーを使うべきだと、実感しました。コメント頂きありがとうざいました。 補足: ユーザ名も表示名も変更できる説明は以下のページでした。 https://help.twitter.com/ja/managing-your-account/change-twitter-handle
guest

0

そもそもユーザー名は変更できるので…。

URLにユーザーID含めるのも普通に使われてることだし何も複雑にならない。

Twitterほどの規模なら今はどうなってるのか分からないけど
一般的には普通にサロゲートキー使っておけばいい。
フレームワークの規約無視して変な作り方するほうが後で困る。

投稿2019/05/05 08:56

kawax

総合スコア10377

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

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

退会済みユーザー

退会済みユーザー

2019/05/05 09:18

コメントありがとうざいます。 ユーザー名の件について本文を修正しました。ご指摘ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問