1

示例场景:假设我的产品公司只有两种类型的买家。

买家1:个人买家

买家2:公司买家

买方 1属性不同:FName、LName、Bdate 和 Age

买方 2属性不同:Company_Name、Nature_Of_Business 和 Type_Of_Business

2 个买家的共同点是:地址、电子邮件、电话号码、国家

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

我的解释:如果您尝试查看表买家,个人和公司买家的属性都被合并,因为他们都是买家,他们只是根据买家类型(个人或公司)分类

问题:如果买家类型是公司,那么我的个人属性(即 FName、LName 等)将被记录为空,反之亦然。我的想法阻止我将它们分开,因为我不想为每个表创建买方 ID。无论是个人还是公司,它们都应该只有 1 个买方 ID。

问题:如何构建数据库表来解决这个查询:

我想要显示所有买家信息且没有空记录的报告。

听起来很疯狂,但是当可能生成报告时,如果买家是公司类型,详细信息可能会给出个人买家字段的空记录

注意:如果我将过滤特定的买家类型,这可以轻松完成,但事实并非如此。我都想要。

4

2 回答 2

2

您可以根据出生日期计算年龄,因此无需存储年龄。

您有一个买家表和单独的个人买家和公司买家表。

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' 代表公司将是定义指标的一种方式。

买家类型 ID 是个人买家 ID 或公司买家 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'))

如果您想要多个买方行,请调整 WHERE 子句。

于 2012-11-29T15:04:26.930 回答
0

您的逻辑架构可能具有三个不同的实体:一个包含所有公共字段的抽象采购商,以及两个从其继承的子实体:个人采购商和公司采购商。

如何在物理上实现该架构取决于您。通常,共享相同主键(此处buyerID为 )的所有逻辑实体将合并到同一个物理表中。

有一个表是有意义的:

  • 性能的角度来看:过滤比一般加入占用更少的资源。使用单个表的 DML 也会快得多。

  • 完整性的角度来看:当您有多个表时,很容易插入无效数据。例如,如果您有三个表,则很难保证一个buyerID在子实体中至少有一行且最多一行。

我会选择一个有约束的物理表:

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 (...))
                   )

检查约束还将验证每种类型的必填字段是否不为空。

如果您需要分别访问个人和企业,则可以创建视图:

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 回答