0

私は長い間 php を書いてきましたが、それは常に自分自身で学んだスキルであり、テーブル結合に対する自信の小さな危機に直面しました!

authMyISAM テーブルusersとを含むMySQL データベースを想定しますpermissions

users
- id (auto increment)
- email

permissions
- id (auto increment)
- name

これらのテーブルを多対多 (または 1 対多) で結合するために、私は常にブリッジ テーブルを次のように使用してきました。

user_permissions
- id (auto increment)
- user_id
- permission_id

(innoDB がリレーションシップに対応できることは知っていますが、より複雑で、より多くのメモリを消費するため、q の目的のために、myISAM を使用したいと思います)

私の特定の質問はこれです:自動インクリメントキーを使用してテーブルを結合するのは賢明ですか、それとも独自の追加キーを生成する必要がありますか?

テーブルが破損して再構築する必要がある場合、または 2 つのデータベースへのミラーリングを開始してキーが同期しなくなった場合に、問題が発生する可能性があることを認識しています。

また、行ごとに一意のハッシュを生成すると (結合で使用される)、ハッシュを生成し、すべてのデータを挿入する前にそれが新しいことを確認するオーバーヘッドがあることも認識しています。

他の人はどのようにしていますか?これらの問題は、実際の状況で見たものですか?

御時間ありがとうございます!

アダム

4

2 に答える 2

0

アクセス許可とユーザーの結合は次のようになります。

SELECT      u.*, p.*
FROM        user_permissions up
INNER JOIN  users            u
ON          up.user_id = u.id
INNER JOIN  permissions      p
ON          up.permission_id = p.id

id別のテーブルからこれを参照したい場合を除き、user_permissionの列は実際には必要ありません。その ID を省略した場合、(user_id, permission_id) が主キーになります (この場合、自動インクリメントは行われません)。彼が別の id 列を持っている場合は、(user_id、permission_id) に UNIQUE 制約を追加する必要があります。

于 2010-01-24T21:11:19.627 に答える
-1

これは一般に、代理キー (一意である以上の意味を持たない、作成または自動的に割り当てられた値) と自然キー (名前や銀行など、格納されているエンティティに関して何らかの意味を持つキー) を使用するかどうかの決定です。アカウント #)。

あなたの場合、機能する自然キーがあるかどうかは明らかではありません(ユーザーテーブルのあらゆる側面が変更される可能性があります-結婚後の名前の変更など)。関係を維持しながらキーがモーフィングする可能性がない場合は、自然キーが必要になります。例としてはAu, He, Es、元素の周期表の元素名 ( など) のようなものがあります (新しい元素を追加する以外は変更される可能性は低いですが、何かが起こる可能性があります...)。

データの破損に関しては、何でも破損する可能性があるため、バックアップは本当に最善の保護です。また、通常の操作では、移行または同期の際に常に主キーを保持できます。データベースによって提供される自動インクリメントの代わりに精巧に複雑なサロゲートキーを使用すると、挿入が複雑になるため、よりリスクが高くなります(一意であることを確認し、トランザクションの安全な方法で衝突を処理する必要がある可能性があります)...そして実際、精巧に生成されたサロゲートキーは、データが破損した場合には役に立ちません (それをレコードと関連付ける方法はありません)。

ユーザーの電子メールが多くのオーバーヘッドになると言う自然な PK は、電子メールが変更されるたびにすべての関係を更新する必要があり、2 つのアカウント間で電子メール アドレスを交換することは複雑です。トレードオフは、自動インクリメント キーに有利に傾いています。

良い記事はここにあります:

http://decipherinfosys.wordpress.com/2007/02/01/surrogate-keys-vs-natural-keys-for-primary-key/

于 2010-01-24T21:14:44.890 に答える