質問

最近のいくつかの質問で列の名前付けの戦略について説明しましたが、列名に外部キーと主キーの概念を埋め込むという概念を発見して、かなり驚きました。それは

select t1.col_a, t1.col_b, t2.col_z
from t1 inner join t2 on t1.id_foo_pk = t2.id_foo_fk

私は、この種のスキームを使用するデータベースシステムで作業したことは一度もないと告白しなければなりません。私の見方では、システムのN個のプリンシパルテーブルを学習したら、それらのテーブルを使用して数桁も多くのリクエストを記述します。

開発の生産性を高めるには、どのテーブルが重要なテーブルであり、どのテーブルが単純な支流であるかを学習する必要があります。十分な数の列名をメモリにコミットする必要があります。基本的なタスクの1つは、2つのテーブルを結合することです。学習の労力を減らすために、最も簡単なことは、両方のテーブルで列名が同じであることを確認することです。

select t1.col_a, t1.col_b, t2.col_z
from t1 inner join t2 on t1.id_foo = t2.id_foo

開発者として、どの列が主キーであり、どの列が外部キーであり、どの列が何でもないことを覚えておく必要はないと思います。興味があれば、スキーマを見るのは簡単です。ランダムに見るとき

tx inner join ty on tx.id_bar = ty.id_bar

...どのキーが外部キーであるかを知ることは非常に重要ですか?外部キーは、参照整合性を確保し、更新および削除中に正しいことを行うために、データベースエンジン自体にとってのみ重要です。

ここで解決されている問題は何ですか? (これは議論するための招待状であることを知っているので、気軽にそうしてください。しかし、同時に、私は本当に何かを逃しているかもしれないという点で、答えを探しています。

) >
役に立ちましたか?

解決

子テーブルの外部キー列は、親テーブルの主キー列と同じ名前にする必要があることに同意します。これにより、次のような構文が許可されることに注意してください。

SELECT * FROM foo JOIN bar USING (foo_id);

USINGキーワードは、両方のテーブルに同じ名前の列が存在し、等結合が必要であることを前提としています。これをより詳細な省略形として利用できると便利です。

SELECT * FROM foo JOIN bar ON (foo.foo_id = bar.foo_id);

ただし、外部キーに参照する主キーと同じ名前を付けることができない場合があります。たとえば、自己参照があるテーブルの場合:

CREATE TABLE Employees (
  emp_id INT PRIMARY KEY,
  manager_id INT REFERENCES Employees(emp_id)
);

また、テーブルは同じ親テーブルへの複数の外部キーを持つことができます。列の名前を使用して関係の性質を説明すると便利です。

CREATE TABLE Bugs (
  ...
  reported_by INT REFERENCES Accounts(account_id),
  assigned_to INT REFERENCES Accounts(account_id),
  ...
);

列名に表の名前を含めたくない。また、義務的な「id」を避けます。すべてのテーブルの主キー列の名前として。

他のヒント

同意します。この情報をWindowsの初期のくだらないハンガリー記法の愚かさの列名に入れます。

ここで提案されたアイデアのほとんどは、私がSQLデータベースを使用して開発してきた20年以上にわたって支持されてきたと言って恥ずかしいです。それらのほとんどは期待される利点をほとんどまたはまったく提供せず、後知恵、首の痛みを伴っていました。

スキーマで数時間以上費やしたときはいつでも、最も重要なテーブルとその列にかなり早く慣れてきました。数か月たつと、頭の中に全部入ってしまいます。

この説明は誰のためですか?設計に数分しか費やさない人は、とにかく深刻なことをするつもりはありません。サンスクリット語で列に名前を付けた場合、長い間使用する予定のある人は学習します。

複合主キーを無視して、「id」のような単純なものがなぜ表示されるのかわかりません。主キーでは十分ではなく、「_ id」も外部キー用。

したがって、一般的な結合条件は customer.id = order.customer_id になります。

2つのテーブル間に複数のアソシエーションが存在する場合、テーブル名ではなくアソシエーションを使用する傾向があるため、おそらく「parent_id」および" child_id" " parent_person_id"ではなくなど

主キーのIDサフィックスを持つテーブル名のみを使用します。 CustomerId、および他のテーブルからそれを参照する外部キーもCustomerIdと呼ばれます。アプリケーションで参照すると、オブジェクトプロパティからテーブルが明らかになります。 Customer.TelephoneNumber、Customer.CustomerIdなど

" fk_"を使用しました主にテーブルの外部キーのフロントエンドにあります。これは主に、私のショップでプロジェクト用のDBを開発するときにテーブルをまっすぐに保つのに役立ちました。過去にDBの仕事をしたことがなかったので、これは助けになりました。後から考えると、おそらくそれをする必要はなかったかもしれませんが、いくつかの列名に3文字が付けられていたので、汗をかきませんでした。

DBアプリ作成の初心者である私は、経験豊富なDB開発者を震え上がらせるいくつかの決定を下したかもしれませんが、外部キーが本当に大したことなのかわかりません。繰り返しますが、これはこの問題の観点の違いだと思います。あなたが書いたものを確実に取り上げて、それについて考えます。

良いものがあります!

あなたに同意します-多くの企業環境で推奨されていると思われる別のアプローチを採用しています:

TableNameFieldName 形式の名前列。したがって、Customerテーブルがあり、UserNameが自分のフィールドの1つである場合、フィールドはCustomerUserNameと呼ばれます。つまり、Invoiceという別のテーブルがあり、顧客のユーザー名が外部キーである場合、InvoiceCustomerUserNameと呼び、それを参照するときにInvoice.CustomerUserNameと呼び、すぐにどのテーブルにあるかがわかります。

また、この名前付けは、列を作成しているときに元の列のテーブルを追跡するのに役立ちます。

DBMSの外部キーと主キーの実際の名前にはFK_とPK_のみを使用しています。

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