1

ベスト プラクティスとパフォーマンスに関するアドバイスが必要です。

Employees、Jobs、Ranks の 3 つのテーブルがあるとします。すべての従業員には仕事とランクがあるため、当然、従業員テーブルでこれらのテーブルを参照する必要があります。

私の質問は、これらのオプションのどれが最適かということです:

1) 各ジョブとランクは、わかりやすい名前とペアになった一意の ID で保存されます。Employees テーブルは他のテーブルの一意の ID を参照する必要があるため、メモリを節約できます (わかりやすい名前は Jobs/Ranks テーブルに一度だけ保存されます) JOIN

SELECT Employees.EMPL_ID, Ranks.R_NAME, Jobs.J_NAME
FROM Jobs
JOIN Ranks ON Ranks.R_ID=Employees.RANK
JOIN Jobs ON Jobs.J_ID=Employees.JOB

2) 一意の説明的な名前のみ。各ランク/ジョブのわかりやすい名前を繰り返し保存するため、メモリの無駄になる可能性がありますが、SELECTステートメントの時間を節約できます

<編集: >

明確にするために、私の主な関心事は、1 つのステートメントではなくSELECT複数の を使用して を実行する必要がある場合に対処しなければならないパフォーマンスです。JOINSELECT

多くのトラフィックを処理できるようにしたいと考えています。具体的には、従業員がジョブとランクを確認するように要求しています。

<編集>

例:

オプション 1 (ID と名前):

Employees:
 __________________________
/ EMPL_ID  |  RANK  | JOB  \
|    1     |    2   |  3   |
|    1     |    1   |  3   |
|    1     |    1   |  1   |
\__________|________|______/

Ranks:
 __________________
/  R_ID  |  R_NAME \
|    1   |   GRUNT |
|    2   |   BOSS  |
\________|_________/

Jobs:
 ____________________
/  J_ID  |  J_NAME   \
|   1    | JANITOR   |
|   3    | PRESIDENT |
\________|___________/

オプション 2 (一意の名前):

Employees:
 _______________________________
/ EMPL_ID  |  RANK  | JOB       \
|    1     |  BOSS  | PRESIDENT |
|    1     |  GRUNT | PRESIDENT |
|    1     |  GRUNT | JANITOR   |
\__________|________|___________/

Ranks:
 __________
/   R_NAME \
|    GRUNT |
|    BOSS  |
\__________/

Jobs:
 ___________
/  J_NAME   \
| JANITOR   |
| PRESIDENT |
\___________/
4

2 に答える 2

1

はい、常に各行に一意の ID を与えます。

テーブルごとに常にこれを使用することをお勧めします。通常は「id」または「the-table-name_id」と呼ばれます

ビジネス上の価値はありません。

多くの「保証された一意の」レコードは、必要性または存在または重複レコードを後で見つけます。これが満たされた/発見されたときに、常に一意の主キーを持っていると非常に役立ちます。

「一意」の一例です...そうではありません....システムに人々の社会保障番号がある場合、それらは一意である必要があります。ただし、タイプミスする可能性があります。次に、「入力ミス」の値を持つ人が提示され、その番号が入力されたときに...これを許可/解決する際に、すべての行がssnではなくビジネス価値のない独自のIDを持つことが非常に役立ちます行の識別以外のすべて。

一意のレコードは非常によく知られている問題です。すべてのレコードに一意の ID を持つことは、それに対処するソリューションの一部です。

上記のすべての例外は、パフォーマンスです。SQL データベースは結合速度を考慮して設計されているため、数千レコードの結合速度についてはあまり心配していません。私は、一意の識別の利点が欠点を上回ることを発見しました。パフォーマンス要件により、上記のプラクティスを変更する場合があります。たとえば、メモリにロードする必要があるレコードが数百万ある場合、一意の ID のスペースのオーバーヘッドが問題になる可能性があります。多くの場合、これらのケースでは、Redis、MongoDB などの SQL を使用しないソリューションに注目し始めます。

SO および他のサイトに関する追加の参照を次に示します。

テーブルの主キーのベスト プラクティスは何ですか?

一般に、データベース内のすべてのテーブルには、PK として使用する ID フィールドが必要ですか?

http://www.sql-server-performance.com/forum/threads/do-i-need-a-unique-identifier-or-identity-column.16910/

ID列はSQLで本当に必要ですか?

ある回答では、「コミュニティでの宗教的な議論のような自然対代理キーの使用」についてもコメントされています。また、回答者がどのように「ルール」を取得したかについてのコメントもあります...ティーヒー...

于 2012-12-02T13:27:38.960 に答える
0

EMPL_ID (EmployeeID) を追加することを強くお勧めします。現時点では、アプリケーションは完全に正常に動作するかもしれませんが、アプリケーションを拡張するときは、たとえそうしないと思っていても、EMPL_ID が役に立ちます。

それだけでなく、EMPL_ID をコードで使用でき、現在または将来構築する他のテーブルにアクセスする必要がある場合は、両方の R_ID を複製する代わりに、そのテーブルに EMPL_ID を追加するだけです。新しいテーブルの J_ID。

たとえば、tblNotes テーブルを追加した場合です。(私はあなたのアプリケーションの範囲を知らないので、この議論のためにメモ表を参照します)

この例では、noteID、EMPL_ID、note、noteDateTime などの列のみが必要です。

EMPL_ID を追加しないと、複数のテーブルに不要な余分な列ができてしまいます。

また、インデックスの追加は 1 つの列にのみ行う必要があります。

私は常にすべてのテーブルに ID を追加しています。これは、特にアプリケーションが成長したときに、作業が非常に楽になるためです。また、同じ名前の従業員が 2 人いる会社もいくつか見てきました。もちろん、彼らが同じ階級と仕事を持っている可能性は低いですが、これは単なる考察の材料です!

あなたの質問を正しく理解し、役立つ情報を提供できたことを願っています。

ジョン

于 2012-12-02T13:44:11.783 に答える