質問

背景

私はこの表を持っています

+-------------------------+  +------------------------+
|Airport                  |  |Country                 |
|-------------------------|  |------------------------|
|airport_code string (PK) |  |country_code string (PK)|
|address string           |  |name string             |
|name  string             |  +------------------------+
+-------------------------+

+-------------------------+
|Currency                 |
|-------------------------|
|currency_code string (PK)|
|name string              |
+-------------------------+
.

airport_code IATA(International Air Transport Association) 空港コード、あなたが飛行機で移動するときにあなたの荷物タグでそれらを見ることができます。

画像の入力ここにある画像の入力

country_code ISO 3166-1 A3標準国です。コード、あなたはオリンピックでそれらを見ることができます。

ENTER IMENTDESCRUストレーション

currency_code is0 417標準3-chars通貨コード、あなたはそれらを国際交流展示板で見ることができます。

Enter Image説明

質問

これらの天然のpksは十分に良いですか?

世界尊敬されている標準を使用しています。これは、PKSに十分な業界全体が十分に得られていますか?

このテーブルを行う必要がありますか?

役に立ちましたか?

解決

いいえ、そうではありません。それらのキーは間違いなく十分に良いです!

彼らはユニークです、 否定的な変化につく、意味のあるは代理鍵の上にステップアップします。それは良いPKの定義です。

不変で数値整数であるPKSの制限は、リレーショナルモデル(CODD ')の一部ではありません。SQL規格(ANSIまたはその他)。

他のヒント

が非常に強い言葉であり、厳密な意味では、おそらくが必要ではない代理◆

しかし、データベースの場合は、おそらく代理キーを追加することができます。私は必ずしも私のデータベース設計が、彼らの標準がどのように安定しているかにかかわらず、第三者の束(IATA、ISO)に依存しているとは限りません。あるいは、私は特定の標準に頼りにくいかもしれません(他の通貨コード基準がありますか?私は知りません)。私はおそらく私のテーブルをサロゲートキーでモデルのようにモデル化するでしょう:

+-------------------------+  +------------------------+
|Airport                  |  |Country                 |
|-------------------------|  |------------------------|
|airport_id       int (PK)|  |country_id     int (PK) |
|iata_airport_code string |  |iso_country_code string |
|icao_airport_code string |  +------------------------+
|faa_identifier    string |  
|address           string |  
|name              string |  
+-------------------------+

+-------------------------+
|Currency                 |
|-------------------------|
|currency_id int (PK)     |
|iso_currency_code string |
|name string              |
+-------------------------+
.

つまり、それらの業界標準コードが私のアプリケーションに本質的に重要なでない限り、それらを私のテーブルのPKとして使用しないでしょう。彼らはただのラベルです。私の他のテーブルのほとんどはおそらく代理キーを起こし、この設定は私のデータモデルに一貫性を追加します。代理キーの「追加」のコストは最小限です。

いくつかのコメントに基づく更新:

例の表の文脈を知らずに、IATAの空港コードのようなものがデータベースを使用しているアプリケーションにどれほど重要かを知ることは不可能です。明らかに、IATAコードがアプリケーション全体に集中的に重要に重要で使用されている場合は、テーブルのPKとしてコードを使用するために、正しい分析後、正しい決定である可能性があります。

しかし、テーブルがアプリのいくつかのコーナーで使用されているルックアップテーブルの場合、IATAコードの相対的な重要性は、データベースインフラストラクチャ内のそのような目立つスポットを正当化することはできません。もちろん、ここではいくつかの質問に追加の参加をする必要があるかもしれませんが、IATAコードを完全に理解することを確実に理解するために研究を行うのにかかる努力と些細なことがあるかもしれません。主キーフィールド場合によっては、気にしないだけでなく、はIATAコードについてを気にする必要がありません。 @james Snellのコメントは、私のテーブルのPKに影響を与えることを心配しなければならないかもしれない何かの完璧な例です。

また、設計の一貫性が重要です。すべてのテーブルを持つデータベースがすべて一貫して設計されたサロゲートキーを設計し、次にPKとしてサードパーティ製のコードを使用しているいくつかのルックアップテーブルを使用している場合、矛盾が発生します。それは全く悪くないが、それはドキュメンテーションにおいて特別な注意を払う必要があり、それは保証されないかもしれない。 ルックアップテーブルは、一貫性のために代理鍵を使用するだけで、善意は完全に大丈夫です。

さらなる研究に基づく更新:

OK、好奇心が少し私と私は、質問に記載されているリンクから始めて、楽しみのためのIATAの空港コードに関する研究を行うことにしました。

判明したとき、IATAコードは、質問がそうであることを知らせるので、ユニバーサルで権威としてはありません。 このページ

ほとんどの国は、4文字を使用しています。 公式航空刊行物

さらに、IATAコードとICAOコードは faa識別子コードです。飛行場を識別するもう1つの方法はもう一つです。

これらの上の私のポイントは、どのコードがより普遍的なまたはより包括的な包括的な包括的な包括的な、または任意の第三者の識別子の周囲にデータベース構造を設計するのかを正確に示すために議論を開始することではありません。 の特定の事業上の理由がない限り、

この場合、私のデータベースは、IATAコード(または任意の第三者、潜在的に変更可能なコード)を主なキー候補として転記することによって、より構造化、より安定した、そしてより柔軟であることを感じるでしょう。そして代理キーを使用してください。そうすることによって、主なキー選択のためにクロミングする可能性のある潜在的な落とし穴を偽造することができます。

フィールド上の代理鍵が大丈夫で、検討するものが索引ページサイズ自体になる可能性があるということに問題はありません。

これはあなたが多くの結合を行っていて、数値タイプの代理キーを持っているリレーショナルデータベースですので、データベースを処理することが簡単になる可能性があるため、インデックスページサイズは小さくなり、したがってトラフ検索が速くなります。 。これが小さなプロジェクトであるならば、それは問題ではありません、そして、問題なく得るでしょう。しかし、アプリケーションが大きくなるほど、ボトルネックを減らすことができます。

ビッグインブ、int、smallint、tinyint、または整数のようなデータ型を持つことは、道路の故障を妨げる可能性があります。

私の2セント

更新:

小プロジェクト - おそらく数十人でさえも使われています。小規模、デモプロジェクト、個人的な使用のプロジェクト、経験なしのスキルなどのスキルなどを提示するときにポートフォリオに追加するものなど。

大プロジェクト - 毎日何千もの数十億の何百万ものユーザーによって使用されます。あなたが巨大なユーザーベースを持つ国内/国際会社のために構築するもの。

通常、レコードが選択されていることを選択し、サーバーは高速アクセスの結果をキャッシュしていますが、今度は毎回使用されていないレコードにアクセスする必要があります。その時点でサーバーが浸す必要があります。インデックスページに。 (空港名との上記の例では、人々はしばしば国内の航空会社を飛ばしています。

VARCHARが使用されている場合、データが常に同じLENGHTでない限り、間隔が均一ではない場合(CHAR値がより効果的な場合)。これにより、インデックスの検索が遅くなり、サーバーはすでに毎秒何千ものクエリを処理していることで、現在不均一なインデックスをトラフする時間を無駄にする必要があります。最適化されていないテーブルで定期的に選択され、データ検索をスピードアップするためにできるだけ少ない結合がある例としてDWを取ります。また、データベースエンジンを台無しにすることができるUTFを使用している場合(私はいくつかのケースを見ました)。

個人的には、私自身の経験から、適切に整理されたインデックスが~70%で結合の速度を上げ、整数列に結合することで、結合を約25%~25%程度まで早くすることができます。データ)。メインテーブルが拡大し始め、これらのテーブルがそれらに使用されると、整数データ型が整数のデータ型を持つ列を持つ列を占めます。これは、より多くのスペースを占めるVARCHAR / CHARフィールドを持つ。ディスク容量を節約し、パフォーマンスの向上、およびリレーショナルデータベースの全体的な構造を停止することができます。

また、James Snellが言及されているように:

主キーも不変でなければならない、IATAの空港コードは間違いなくそうではありません。それらはIATAの気まぐれで変えることができます。

だからこれを考慮して、1つのレコードを更新し、1つのレコードに結合するテーブル内のすべてのレコードを更新しなければならない1レコードを更新する必要があります。

「私はずっと代理鍵を使っている」アプローチを取りなさいと、このタイプの懸念を回避することができます。それはあなたのデータをいくつかの考えに与えることが重要であるので、それは良いことではないかもしれませんが、それは確かに多くの時間、エンゲリジー、そして努力を節約します。誰かがこの規則への受給を採用することになったならば、リストされた例は確かに適格であるため、変更を加えるために「議会の行為」が必要なので

データベースのアドホッククエリは確かに役立ちます。ルックアップテーブルを含めることによって同じことをするビューを作成することは、同様に機能することがあります。現代のデータベースは、おそらく問題ではないポイントにこのタイプのものを使ってはるかに良い仕事をします。

標準は劇的に変更された米国に固有の訴訟があります。郵便番号は5 - 9桁から州の略語、州の略語を統合し、期間を取り除きます(イリノイ州が悪い場合は覚えておいてください)そして世界のほとんどはY2Kに対処しました。あなたが何十億レコードを含む世界中でデータを広めるリアルタイムのアプリを持っているならば、カスケードアップデートは最高のアイデアではありませんが、私たち全員がそのような課題に直面する場所で働くべきではありませんか?そのデータセットでは、あなた自身のためにそれをテストし、より絶妙な答えを思いつくことができます。

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top