c/java/etcなどのポインタを使用することができるかどうか不思議です。外部キーに基づいてテーブルを結合するのではなく、このトピックでは、Postgresやその他のRDBMSは、結合するときにFKを含むテーブル全体を検索するのではなく、外部キーが参照する行をすばやく見つけるためにポインタを使用していますか?外部キーを使用するのではなく、別のテーブルの行にテーブルポインタを格納する
答えて
データのリレーショナルモデルの本質的な特徴は、データベースの外部の論理ビューでポインタ、構造リンク、またはアドレスベースのデータアクセスを使用しないことです。実際、ポインターの使用を廃止したのは、1969年にリレーショナルモデルを発明した主な動機の1つでした。
もちろん、ほとんどのリレーショナル/ SQLベースのDBMSではポインタが内部的に使用されています。
しかし、彼らはこの特定の方法で使用されていますか?どのデータベースもディスク上の参照された行へのポインタを格納していますか? –
Oracleには、テーブルの行の物理アドレスを格納するROWIDという名前があります。 [AAL]
表領域に
- データオブジェクトNR(セグメント)
[AAAA8m]
- データファイル
- データブロック(データファイル内)
[AAAAQk]
- 行:彼らはに分けることができる
AAAA8mAALAAAAQkAAA
ようになり(ブロック内)[AAA]
rowidを使用すると、物理的にシングルブロック読み出し。それらは内部的に使用されますが、開発者が直接使用することができます。主キーで行を検索すると、1つ(または少数)の索引読み込みが発生してROWIDが検索され、データベースによってブロックが検索され、行が抽出されます。 ROWIDを知っている場合、索引ルックアップは必要ありません。言い換えれば、リレーショナルデータベースの柱の1つは、モデルが物理ストレージ(ポインタなし)から独立していると考えられるということです。また、特定の実装(dbmsの)が追加機能を透過的に最適化して提供できるようにします。
あなたがROWIDを使用するたびに、Unicornが死亡し、糞が天から落ちます。たとえば、テーブルを縮小したり、パーティション化されたテーブルを更新したり(行を別のパーティションに移動させる場合)、またはテーブルを再構築する場合、またはテーブルをエクスポート/インポートする場合、または...または... ROWIDが変更されます。
結論:ROWIDベースのアクセスは、必然的に失敗するリスクがあるため、通常の索引アクセスよりも十分な利点を提供しません。彼らが存在していることと彼らが何であるかを知ってはいますが、それらに頼ることはありません。
- 1. 別のテーブルの外部キーであるプライマリ・キー列を削除
- 2. pl/sqlを使用してテーブルの行を格納する
- 3. 共通キーに個別のデータとグループを格納する
- 4. 別のテーブルにあるエンタテイメントからの外部キーの作成
- 5. 子テーブルの行を持たないSQL SELECTの外部キー行
- 6. 異なるテーブルの外部キー
- 7. Djangoで動的な外部キーを使用するには?
- 8. テーブルで外部キーを設定する
- 9. テーブルに外部キーを追加する
- 10. テーブルに外部キーを追加する
- 11. Slickのマップされたテーブルを外部キーで使用する方法は?
- 12. 外部キーを使用してMySQLテーブルをリンクする
- 13. 別々のテーブルにユーザーとプロファイルを格納する
- 14. VIM:外部コマンドの出力をレジスタに格納する
- 15. MySQLテーブルの外部キーをリストする実行方法
- 16. MongoDB暗号化キーの格納に使用できるキーストア
- 17. データベースにないテーブルの外部キーORM
- 18. 外部キーを使用してテーブルを削除するための移行の使用
- 19. POSTGRESQL外部キー2つの異なるテーブルの主キーを参照する
- 20. 他のテーブルの外部キーであるプライマリキー行
- 21. 外部キーとContactsContractを使用する
- 22. 2つのテーブルからクエリを実行する際に外部キーを使用する方法
- 23. djangoモデルの外部キーを使用してデータベースpostgresテーブルにアクセスする方法
- 24. サーブレットにキーを格納する
- 25. 外部キーを使用してテーブルに挿入しますか?
- 26. SharePointドキュメントライブラリのデータベースではなくファイルシステムにドキュメントを格納する
- 27. SQL Serverテーブルの外部キーを使用したデータの削除
- 28. RSAキーを格納するのに最適なmysqlデータ型?
- 29. 親テーブルの外部キーであるフィールドを更新する
- 30. テーブルの結合、外部キー
私はよくこれを疑問に思っています。 RDBMSは、外部キー列の値と物理的な行ポインタ(PostgreSQLのctidのような)を秘密裏に格納することができ、索引を経由せずに参照行を見つけることができます。ただし、参照先の表が圧縮されるたびに更新する必要があります。また、行が大きくなるため、IOの帯域幅とキャッシュの負荷が大きくなります。正味の効果があるか?それは複雑さの増加を正当化するだろうか? –