7

MySQL で e コマース Web アプリケーションを設計しようとしていますが、ユーザー テーブルの正しい主キーの選択に問題があります。与えられた例は、説明のための単なるサンプル例です。

ここに画像の説明を入力

ユーザーテーブルには次の定義があります

CREATE  TABLE IF NOT EXISTS `mydb`.`user` (
  `id` INT NOT NULL ,
  `username` VARCHAR(25) NOT NULL ,
  `email` VARCHAR(25) NOT NULL ,
  `external_customer_id` INT NOT NULL ,
  `subscription_end_date` DATETIME NULL ,
  `column_1` VARCHAR(45) NULL ,
  `column_2` VARCHAR(45) NULL ,
  `colum_3` VARCHAR(45) NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `username_UNIQUE` (`username` ASC) ,
  UNIQUE INDEX `email_UNIQUE` (`email` ASC) ,
  UNIQUE INDEX `customer_id_UNIQUE` (`external_customer_id` ASC) )
ENGINE = InnoDB

主キー候補列で次の問題に直面しています。

ID列

長所

  • ビジネス上の意味なし (安定した主キー)
  • テーブル結合の高速化
  • コンパクターインデックス

短所

  • 「自然な」キーではない
  • すべての属性テーブルは「マスター」ユーザー テーブルと結合する必要があるため、非結合の直接クエリは実行できません
  • 「自然な」SQL クエリが少なくなる
  • 情報漏えい: 開始値が 0 の場合、ユーザーは登録済みユーザーの数を知ることができます (開始値を変更すると、これが整理されます) ii) ユーザーは、プロファイルを time_X に user_A として登録し、しばらくしてから time_Y に user_B として登録できます。期間中の登録ユーザー数を計算する ((user_B の ID) - (user_A の ID)/(time_Y - time_X))

メール欄

長所

  • なし

短所

  • ユーザーは電子メール アドレスを変更できる必要があります。主キーには適していません

ユーザー名列

長所

  • 「自然な」主キー
  • テーブル結合が少ない
  • よりシンプルで「自然な」クエリ

短所

  • テーブルを結合するときに varchar 列が遅くなる
  • varchar 列のインデックスは、int 列のインデックスよりコンパクトではありません
  • 外部キーは値に依存するため、ユーザー名を変更するのは非常に困難です。解決策: アプリケーションのすべての外部キーを「同期」する、ユーザーがユーザー名を変更できないようにします。たとえば、ユーザーはプロファイルを削除して新規登録する必要があります。

external_customer 列

長所

  • 顧客の外部参照として使用でき、情報を保持しません (代わりに、編集不可能なユーザー名を使用できますか?)

    短所

  • 自動増分の場合、情報が漏洩する可能性があります (可能であれば)

  • MySQL innodb エンジンは同じテーブルに複数の auto_increment カラムを持たないため、自動インクリメンタル サロゲート ID がすでに使用されている場合、一意の値を生成するのに問題があります。

スケーラブルな e コマース Web アプリケーションのユーザー テーブルの主キーを選択する際の一般的な方法は何ですか? すべてのフィードバックに感謝

4

3 に答える 3

12

あなたの分析の一部については何も言うことはありません。あなたの賛否両論のいくつかをカットしたとしても、それは私が追加するのに役立つものは何もないと思うことを意味するだけです.

ID列

長所

  • ビジネス上の意味なし (安定した主キー)
  • テーブル結合の高速化
  • コンパクターインデックス

まず、NOT NULL UNIQUE と宣言された列または列のセットには、主キーのすべてのプロパティがあります。それらのいずれかを外部キー参照のターゲットとして使用できます。これが実際の目的です。

あなたの場合、あなたの構造では、id、username、email、external_customer_id の 4 つの列を外​​部キー参照のターゲットにすることができます。いつも同じものを使う必要はありません。FK 参照の 90% に id を使用し、それらの 10% に email を使用することは理にかなっています。

安定性は、列にビジネス上の意味があるかどうかとは何の関係もありません。安定性は、値が変化する頻度と状況に関係しています。Oracle を実行していない限り、「安定」は「不変」という意味ではありません。(Oracle は ON UPDATE CASCADE を実行できません。)

テーブル構造とインデックス作成によっては、自然キーの方が高速に実行される場合があります。自然キーにより、一部の結合が不要になります。本番データベースを構築する前にテストを行いました。ID 番号での結合が少ない結合や自然キーよりも優れたパフォーマンスを発揮するようになるまでには、おそらく数十年かかるでしょう。これらのテストについては、SO または DBA で書いています。

他に 3 つの一意のインデックスがあります。(よかった。データベースを構築する人の少なくとも 90% は、それが正しく理解できていないと思います。) したがって、ID 番号のインデックスがこれら 3 つのいずれよりもコンパクトであるというだけではありません。これは追加のインデックスでもあります。(この表では。)

メール欄

長所

  • なし

電子メール アドレスは、安定していて一意であると見なすことができます。外部キー参照のターゲットであるかどうかに関係なく、人々が電子メール アドレスを共有することを止めることはできません。

しかし、メールアドレスは「失われる」可能性があります。米国では、ほとんどの大学生が、卒業後 1 年ほどで *.edu の電子メール アドレスを失います。料金を支払っているドメインからメール アドレスが送信された場合、料金の支払いを停止すると、メール アドレスは失われます。このようなメールアドレスが新規ユーザーに付与される可能性はあると思います。それが耐え難い負担を生み出すかどうかは、アプリケーションに依存します。

短所

  • ユーザーは電子メール アドレスを変更できる必要があります。主キーには適していません

SQL データベースのすべての値を変更できます。お使いの環境で dbms が ON UPDATE CASCADE 宣言をタイムリーに受け入れられない場合にのみ不適切です。私の環境はそうです。(しかし、まともな非共有ハードウェアで PostgreSQL を実行しています。) YMMV。

ユーザー名列

長所

  • 「自然な」主キー
  • テーブル結合が少ない
  • よりシンプルで「自然な」クエリ

結合が少ないことは重要なポイントです。私はコンサルティングのギグに参加しており、ID 番号を無意識に使用して、人々が 40 以上の結合でクエリを作成するのを見てきました。自然キーの賢明な使用により、それらの最大 75% が排除されました。

外部キーのターゲットとして常に代理キーを使用すること (Oracle を除く) や、常に自然キーをターゲットとして使用することは重要ではありません。考えることが重要です。

短所

  • テーブルを結合するときに varchar 列が遅くなる
  • varchar 列のインデックスは、int 列のインデックスよりコンパクトではありません

varchar() での結合が遅いとは、その主張を修飾しないとは言えません。実際のところ、ほとんどの varchar()での結合は ID 番号での結合より低速ですが、使用できないほど低速であるとは限りません。クエリが ID 番号で 4 ミリ秒、varchar() で 6 ミリ秒かかる場合、それが varchar() を不適格とする正当な理由にはならないと思います。また、自然キーを使用すると多くの結合が排除されるため、システム全体の応答が速くなる可能性があります。(他の条件が同じであれば、40 ミリ秒の結合は 10 6 ミリ秒の結合よりもパフォーマンスが低くなります。)

データベースのキャリア (25 年以上) の中で、外部キーのターゲットを選択する際にインデックスの幅が決定的な要因となったケースを思い出すことはできません。

external_customer 列

長所

  • 顧客の外部参照として使用でき、情報を保持しません (代わりに、編集不可能なユーザー名を使用できますか?)

ユーザー名を変更できるシステムは実際にはほとんどありません。ほとんどの場合、本名を変更できますが (私はそう思います)、ユーザー名は変更できません。編集できないユーザー名は完全に合理的だと思います。

于 2012-04-01T22:09:10.600 に答える
4

一般に、Web アプリケーションは、主キーを含め、データベース スキーマを顧客から遠ざけようとします。スキーマ設計を認証方法と混同していると思います.データベース設計で整数を使用して一意に識別したとしても、ユーザーが電子メールアドレスでログインできるようにすることを妨げるものは何もありません.

このようなシステムを設計するときはいつでも、主キーに整数または GUID の ID 列を使用しました。これは高速で、厄介な実生活の状況によって変化することはなく、開発者にとってはなじみのあるイディオムです。

次に、手元のアプリに最適な認証スキームを考え出しました。最近ではほとんどの人が自分のメール アドレスでログインすることを期待しているので、それを使い続けます。もちろん、Facebook、Twitter、または Google アカウントでログインさせることもできます。私の主キーとは何の関係もありませんが...

于 2012-04-01T22:21:39.690 に答える
0

ユーザー名列には、次の短所もあります。

  • ユーザーはユーザー名を変更できる必要があります。主キーには適していません。

あなたが電子メールを使用しないのと同じ理由で、私はユーザー名を使用しません。私にとっては、内部ユーザー整数 ID が最良のアプローチです。

于 2012-04-01T18:41:40.520 に答える