2012-06-07 72 views
1

我有一個現有的應用程序在數據庫Exclusice弧和多多對多的關係數據庫設計問題

  • 客戶
  • InvoiceGroup
  • SalesGroup

一位顧客下列實體可以是多個組的一部分。目前這以如下方式映射:

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

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

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

我現在有要求添加新的實體廣告系列。客戶可以成爲多個廣告系列的一部分。廣告活動的部署是由 創建的客戶羣 - 選擇個人客戶(自定義)或 - 選擇現有invoicegroup(發票)OR - 選擇現有salesgroup(銷售)

該活動的客戶名單應該是 - 可重複使用的,即可以用於多個廣告系列 - 動態的,即如果從發票/銷售團隊創建的,橫跨發票和銷售團隊 變化應該反映到廣告活動的客戶名單

我有困難的設計爲動態要求。我已經提出了以下設計,但它具有專用弧,這是一個指向多個外鍵的鍵,這不是推薦的方法。我曾想過超類型和子類型,但我在設計多對多關係時並不清楚。

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

什麼是更好的方法來設計這個考慮參照完整性和規範化。 每天多次運行最頻繁的查詢將檢索客戶的所有活動信息。所以需要注意多個表和連接。

+0

當你說「我不清楚設計多對多關係」時,你說什麼多對多的關係? –

+0

@Catcall - 我的意思是客戶和廣告系列表以及發票組和廣告系列以及銷售組和廣告系列的多對多關係。正如埃裏克史密斯所建議的,我曾想過爲他們每個人單獨加入表格,但是想知道是否還有其他方法。 – Angela

回答

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) 

也就是說,使用表繼承。這是一個相當規範的設計,在我看來,這是您尚未根據具體要求提供的方法。可選地,您可以通過使其稍微變形並在CampaignList表中放入CampaignListTypeID來讓您的生活更輕鬆。但是,在這種情況下,如果不在觸發器中編寫邏輯,就很難保持數據模型的完整性。

我假設你永遠不會需要做有趣的組合組,例如,2個銷售組+一個發票組+一組客戶。

+0

有趣的組合出​​現在自定義類別下,其中您存儲對客戶的引用而不是組。所以customercampaignlist表格會照顧到這種情況。對於第一種方法,它可能是所有3個表格的多對多關係,這意味着我不能使用第二種方法,因爲列表可能包含1個或更多組,但不會包含組和組合個人客戶。有沒有辦法使用超類型/子類型來實現這個? – Angela

+0

我正在處理您提供的定義,即:「爲通過以下方式創建的客戶組部署活動: - 選擇個別客戶(自定義)或 - 選擇現有發票組(發票)或 - 選擇現有銷售組)」。我的解釋是,這三個選項是相互排斥的......您可以根據個人客戶選擇定義您的廣告系列,*按照銷售組*或*以發票組的形式定義您的廣告系列,但不是三者的結合。 –

+0

U是正確的,它們是互相排斥的(在很多方面都是至少),但是可以根據1+個銷售組或1+個發票組來定義一個活動,其中單獨的表格場景可以工作。廣告系列不會被定義爲銷售組和發票組或銷售組和個人客戶等的組合。此外還有一個重要要求,我錯過了,每天多次查詢最頻繁的查詢將查找所有廣告系列客戶屬於。所以我想,我也需要注意加入。我編輯了這個問題來包含這個要求。 – Angela