みなさん、こんにちは。
私はデータベースとデータベース設計について学んでいますが、まだ自分では答えられない質問に到達しています。ですから、私よりも知識や経験のある人が答えられることを期待して、コミュニティに質問を投げかけます。
私は、艦隊全体の在庫レベルを追跡するデータベースの作成を任されています。
現在の設計には、すべての可能な部品(機械の種類、部品番号、製造元、シリアル番号など)のリストが記載された各船の表があります。
これは、機械または部品の詳細を何度も(実際には船の数だけ)複製できることを意味します。
私は自分で学んだことに基づいて再設計を試みてきました。次のような方針で設計を提案します。
[SHIP]
ID, Name, Class, Tonnage, Fleet, Superintendent etc.
[Machinery]
ID, Type, Make, Model etc. (Can have separate table for manufacturers and types if required)
[Part]
ID, Part number, Description, etc.
上記は3つの主要なテーブルであり、現在は困難になり始めています。
各船は複数の機械アイテムを持つことができ、各機械アイテムは複数の船に存在する可能性があります(ジャンクションテーブルが必要です)
各機械アイテムは複数のパーツを持つことができ、各パーツは複数の機械アイテムに属することができます(別のジャンクションテーブル)
ジャンクションテーブルを巨大にする数十万のパーツが存在する可能性があります。
さらに、在庫を追跡したい場合は、別のジャンクションテーブルを見ています。
[Stock Level]
ShipID, PartID, Stock Level
また、最小在庫が必要な場合(在庫レベルと組み合わせることができますか?)
[Min Stock]
ShipID, PartID, Min Stock
そして最後に、正規化されたデータベース(つまり、Part No.1、Part No.2、またはSerial No.1、Serial No.2がない)を探している場合
いくつかの追加のテーブルが必要になります
[Serial Numbers]
ShipID, MachineryID, Serial No
[Part Numbers]
PartID, Part Number
シリアル番号はおそらくかなり標準的で問題ありませんが、[部品番号]には少なくとも[部品]テーブルと同じ数のレコードが必要です。
マップ(画像なしで表現できる限り、簡単にするためにジャンクションは省略されています)
<>V represent many
-| represent one
-----< Serial Numbers
| V
| |
Ship >---< Machinery >---< Parts ---< Part Numbers
V V
| |
------ Stock Level -------
さて、本当の問題は、このような巨大なジャンクションテーブルを排除する基本的な設計原則に何かが欠けているのか、それともこの種のデータベースで予想されることなのかということです。
また、正規化で元のテーブルの追加の列ではなく、少なくとも同じ数のレコードを持つ追加のテーブルが必要な部品番号の場合、これは後でクエリ速度を向上させるために非正規化するようなものですか?
外部リソース(他のフォーラム、チュートリアル、書籍を含む)へのヒント、ヒント、またはポインターをいただければ幸いです。
すべての回答を歓迎します。ご協力いただきありがとうございます。
デイブ