1

シナリオの例:ある製品ハウスに 2 種類のバイヤーしかいないとします。

購入者 1: 個人の購入者

購入者 2: 会社の購入者

購入者 1 の属性に固有: FName、LName、Bdate、Age

バイヤー 2 の属性に固有: Company_Name、Nature_Of_Business、Type_Of_Business

2 人の購入者に共通するのは、Address、Email、Tel_No、Country です。

 Db Table Name: Buyer
 Attributes: BuyerID, BuyerType **FName,LName,Bdate,Age**,Company_Name, Nature_Of_Business and Type_Of_Business

私の説明:テーブル Buyer を表示しようとすると、個人のバイヤーと会社のバイヤーの両方の属性がマージされます。これらはすべてバイヤーであり、BuyerType (個人または会社) に基づいて分類されているためです。

問題:購入者のタイプが会社の場合、個人の属性 (つまり、FName、LName など) が空として記録されるか、またはその逆になります。テーブルごとにバイヤーの ID を作成したくないので、それらを分離することはできないと考えています。

問題:このクエリを解決するために DB テーブルを作成する方法:

空のレコードがないすべてのバイヤー情報を示すレポートが必要です。

ばかげているように聞こえますが、可能なレポートが生成されると、購入者のタイプが会社である場合、詳細は個々の購入者フィールドの空のレコードを与える可能性があります

注:これは、特定のバイヤー タイプをフィルター処理する場合に簡単に実行できますが、そうではありません。私は全て欲しい。

4

2 に答える 2

2

生年月日から年齢を計算できるので、年齢を保存する必要はありません。

1 つのバイヤー テーブルと、個別のバイヤー テーブルと会社のバイヤー テーブルがあります。

Buyer
------
Buyer ID
Buyer Type
Buyer Type ID
Address
Country
Email
Telephone Number

Individual Buyer
----------------
Individual Buyer ID
Last Name
First Name
Birth Date

Company Buyer
-------------
Company Buyer ID
Company Name
Type of Business
Nature of Business

バイヤー タイプは、このバイヤーの特定のサブ テーブルを指すインジケータです。個人を表す「I」と会社を表す「C」は、指標を定義する 1 つの方法です。

Buyer Type ID は、Individual Buyer ID または Company Buyer ID への外部キーです。

すべての購入者情報を取得する SQL は次のようになります。

SELECT *
FROM Buyer, "Individual Buyer", "Company Buyer"
WHERE "Buyer ID" = 12345
  AND (("Buyer Type ID" = "Individual Buyer ID") AND ("Buyer Type" = 'I'))
   OR (("Buyer Type ID" = "Company Buyer ID") AND ("Buyer Type" = 'C'))

複数の Buyer 行が必要な場合は、WHERE 句を調整します。

于 2012-11-29T15:04:26.930 に答える
0

論理スキーマには、おそらく 3 つの異なるエンティティがあります。すべての共通フィールドを含む抽象的な Buyer と、それを継承する 2 つのサブエンティティ (Individual Buyer と Company Buyer) です。

そのスキーマを物理的にどのように実装するかは、あなた次第です。通常、同じ主キー (ここではbuyerID) を共有するすべての論理エンティティは、同じ物理テーブルにマージされます。

単一のテーブルを持つことは理にかなっています。

  • パフォーマンスの観点から: フィルタリングは、通常の参加よりも少ないリソースで済みます。DML は、単一のテーブルでもはるかに高速になります。

  • 整合性の観点から: 複数のテーブルがある場合、無効なデータを挿入するのは非常に簡単です。たとえば、3 つのテーブルがある場合、buyerID がサブエンティティに少なくとも1行、最大で1 行あることを保証するのは困難です。

制約のある単一の物理テーブルを使用します。

CREATE TABLE buyer (BuyerID primary key, BuyerType, 
                    FName,LName,Bdate,
                    Company_Name, Nature_Of_Business, Type_Of_Business,
                    CONSTRAINT individual_chk 
                       CHECK (BuyerType = 2 OR (Company_name IS NULL AND
                                                Nature_Of_Business IS NULL AND
                                                Type_Of_Business IS NULL)
                              ),
                    CONSTRAINT company_chk
                       CHECK (BuyerType = 1 OR (...))
                   )

チェック制約は、各型の必須フィールドが null でないことも検証します。

個人とビジネスに別々にアクセスする必要がある場合は、ビューを作成できます。

CREATE VIEW individual_buyer IS 
   SELECT BuyerID, 
          FName,LName,Bdate
     FROM buyer 
    WHERE buyerType = 1

CREATE VIEW company_buyer IS 
   SELECT BuyerID, 
          Company_Name, Nature_Of_Business, Type_Of_Business
     FROM buyer 
    WHERE buyerType = 2
于 2012-11-29T16:33:38.283 に答える