1

我有一个现有的应用程序,在数据库中有以下实体

  • 顾客
  • 发票组
  • 销售组

一个客户可以是多个组的一部分。目前这是通过以下方式映射的

Customer table
 - cid (Pk)
 - fname
 - surname
 ----
 ---
 - invgrpdid (Fk)
 - salesid (Fk)

Invoicegroup table
 - invgrpid (Pk)
 - name
 - type
 ---
 ----

Salesgroup table
 - salesid (Pk)
 - name
 - desc
 -----
 -----

我现在需要添加一个新的实体广告系列。一个客户可以是多个活动的一部分。为通过以下方式创建的客户组部署活动 - 选择单个客户(自定义)或 - 选择现有发票组(发票)或 - 选择现有销售组(销售)

活动客户列表应 - 可重复使用,即可用于多个活动 - 动态,即如果从发票/销售组创建,发票和销售组之间的更改应反映到活动客户列表

我在设计动态需求时遇到了困难。我提出了以下设计,但它具有专有弧,即一个键引用多个外键,这不是推荐的方法。我想过超类型和子类型,但我不清楚设计多对多关系。

campaign
 - campaignid(Pk)
 - name
 - startdate
 - status
 ------

campaignlist
 - listid(Pk)
 - listname
 - listtype - Invoice, Sales, Custom
 - typeid (Fk) - Refers to invoicegroupid or salesgroupid depending on listtype
 -----

customercampaign
  - listid (Fk)
  - customerid (Fk)
  - status
  - dateupdated
  -------------

考虑到参照完整性和规范化,什么是更好的设计方法。每天多次运行的最频繁查询是检索客户的所有活动信息。所以需要注意多个表和连接。

4

1 回答 1

1

在第一次刺伤时,我会做这样的事情:

CampaignList
    - ID (PK)
    - Name

CustomerCampaignList
    - CampaignListID (FK to CampaignList.ID)
    - CustomerID (FK)
      UNIQUE (CampaignListID, CustomerID)

SalesGroupCampaignList
    - CampaignListID (PK,FK to CampaignList.ID)
    - SalesGroupID (FK)
      UNIQUE (CampaignListID, SalesGroupID)

InvoiceGroupCampaignList
    - CampaignListID (PK,FK to CampaignList.ID)
    - InvoiceGroupID (FK)
      UNIQUE (CampaignListID, InvoiceGroupID)

即使用表继承。这是一个相当标准化的设计,在我看来,这是在您尚未了解具体要求时采用的方法。或者,您可以通过将 a 反规范化一点并将 aCampaignListTypeID放入CampaignList表中来使您的生活更轻松。但是,在这种情况下,如果不在触发器中编写逻辑,就很难保持数据模型的完整性。

我假设您永远不必做有趣的组合组,例如 2 x 销售组 + 发票组 + 一组客户。

于 2012-06-07T05:36:58.943 回答