[解決済み] SQL - 多対多のテーブルの主キー
質問
この質問に対するコメントを読んでの質問です。
多対多のテーブルを作成する場合、2 つの外部キー列に複合主キーを作成すべきか、または自動インクリメントの代理主キー "ID"を作成し、2 つの FK 列にインデックスを置くだけ(そしておそらくユニーク制約も)でしょうか。 それぞれのケースで、新しいレコードの挿入や再インデックス付けのパフォーマンスにはどのような影響があるのでしょうか?
基本的には、これです。
PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)
vs これ
PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
とコメントされています。
2つのIDをPKにすることは、テーブルがディスク上で物理的にソートされることを意味します。 テーブルがディスク上で物理的にソートされることを意味します。 でソートされることを意味します。つまり、もし (Part1/Device1)、(Part1/Device2), (Part2/Device3)、(Part1/Device3)の順で挿入すると を挿入すると、データベースはテーブルを分割して テーブルを分割し、最後の1つを挿入する必要があります。 を挿入する必要があります。多くの 多くのレコードでは、これは非常に問題になります。 数百、数千、数百万のレコードをシャッフルすることになるので 何百、何千、何万というレコードを シャッフルすることになる。これに対して 自動インクリメントのPKでは、新しいレコードを最後に追加することができます。 のレコードは最後に追加されます。
私が質問している理由は、サロゲート自動インクリメント列のない複合プライマリキーを常に行うように傾いているからです。
どのように解決するのですか?
単純な2列の多対多のマッピングでは、代理キーを持つことの本当の利点はないと思います。に主キーを持つことは
(col1,col2)
に主キーを持つことは、一意性が保証されます (あなたの
col1
と
col2
の値は一意です)。
(col2,col1)
に対する別のインデックスは、逆の順序の方が速く実行されるようなケースを捕捉します。サロゲートはスペースの無駄です。
テーブルは参照される2つのテーブルを結合するためだけに使用されるため、個々のカラムに対するインデックスは必要ありません。
あなたが質問で言及したそのコメントは、私の意見では、それが使用する電子の価値がありません。著者は、テーブルが非常に高いパフォーマンスのバランスのとれた多方向木構造ではなく、配列に格納されていると考えているように聞こえます。
まず第一に、テーブルを格納したり、あるいは テーブル をソートする必要はなく、インデックスだけです。そして、インデックスが 格納される に格納されるのではなく、素早く取り出せるように効率的な方法で格納されます。
さらに、データベースのテーブルの大部分は、読み込まれた はるか よりも頻繁に読み込まれます。そのため、select 側で行うことは、insert 側で行うことよりもはるかに関連性が高くなります。
関連
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] SQLテーブルで重複する値を検索する
-
[解決済み] SQL Serverでレコードを削除した後、IDシードをリセットする。
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] SQL Serverには、.NETのMath.Maxのような2つの値を取るMax関数はありますか?
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み】SQL Server、既存のテーブルに自動インクリメントの主キーを追加する。
-
[解決済み】PostgreSQLで主キーの自動インクリメントを設定する方法は?
-
[解決済み】複合主キーの正しい作成方法 - MYSQL
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQL】1136 - 列数が1行目の値数と一致しない問題を解決
-
MHAの高可用性構成とフェイルオーバー
-
[解決済み] MySQLの「スキーマの作成」と「データベースの作成」 - 違いはあるのか?
-
[解決済み] 複数の列でgroup byを使用する
-
[解決済み] mysqldumpで特定のテーブルをスキップする
-
[解決済み] フラットテーブルをツリーにパースする最も効率的/エレガントな方法は何ですか?
-
[解決済み] Count()で条件を指定することは可能ですか?
-
[解決済み] "ON UPDATE CASCADE "を使用する場合について
-
[解決済み] Selectステートメントで特定のフィールドの重複を検索する
-
[解決済み] Postgres でサブクエリを使用してテーブルの行を更新する