2012-09-20 174 views
1

我設計這個數據庫和C#應用程序,一個記錄被保存到數據庫中。現在說我們有三個銷售人員,每個人都應該被嚴格輪流分配一個記錄,以便他們能夠在相同數量的記錄上工作。記錄銷售人員

我迄今所做的是創建一個表名爲Records和一個SalesPerson,該記錄將有營業員id爲外鍵和另一列會說這劑被分配到和將增加此列。

你認爲這是一個好的設計,如果不是你可以給任何想法?

+0

什麼是記錄,一個銷售機會? –

回答

1

這是相當混亂,我懷疑你正在使用的數據庫術語「記錄」藏漢作爲一個對象/實體「記錄」。

有一個表中還設有作爲另一個表的外鍵是好的,雖然,是一個唯一的標識符的簡單的概念。它避免了冗餘。

Basics of normalisation

+0

說如果我有一個名爲「記錄」和表稱爲「SalesPerson」的表。並且SalesPerson ID是Records表中的外鍵。現在我該如何爲每個銷售人員分配相同數量的記錄? – Zaki

+0

@ Sam1:你是什麼意思「轉讓」?您是否想在某些時候在可用人員之間分發可用記錄? – tsionyx

+0

你需要一個n-m表格。所以你有一個帶有SalesPersonID和RecordID的表。在這裏,您可以將您的記錄「分配」給不同的SalesPerson。它聽起來不錯嗎?我不確定我是否理解你的問題。 – margabit

2

要做到這一點,我會使用分析功能ROW_NUMBERNTILE(假設你的RDBMS支持它們)。通過這種方式,您可以爲每個可用的銷售人員分配一個從1開始遞增的虛擬ID,然後爲每個未分配的記錄隨機分配這些僞ID中的一個,以在銷售人員之間平均分配它們。使用僞ID而不是實際ID允許SalesPersonID字段不連續。例如

-- CREATE SOME SAMPLE DATA 
DECLARE @SalesPerson TABLE (SalesPersonID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY, Name VARCHAR(50) NOT NULL, Active BIT NOT NULL) 
DECLARE @Record TABLE (RecordID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY, SalesPersonFK INT NULL, SomeOtherInfo VARCHAR(100)) 

INSERT @SalesPerson VALUES ('TEST1', 1), ('TEST2', 0), ('TEST3', 1), ('TEST4', 1); 
INSERT @Record (SomeOtherInfo) 
SELECT Name 
FROM Sys.all_Objects 

有了這個樣本數據的第一步是找到記錄分配給現有銷售人員的數量:使用CTE包含窗口函數(因爲他們不能

DECLARE @Count INT = (SELECT COUNT(*) FROM @SalesPerson WHERE Active = 1) 

下一頁用於連接子句)

;WITH Records AS 
( SELECT *, 
      NTILE(@Count) OVER(ORDER BY NEWID()) [PseudoSalesPersonID] 
    FROM @Record 
    WHERE SalesPersonFK IS NULL  -- UNALLOCATED RECORDS 
), SalesPeople AS 
( SELECT SalesPersonID, 
      ROW_NUMBER() OVER (ORDER BY SalesPersonID) [RowNumber] 
    FROM @SalesPerson 
    WHERE Active = 1     -- ACTIVE SALES PEOPLE 
) 

最後的實際銷售記錄更新CTE PERSONID,而不是一個僞ID

UPDATE Records 
SET  SalesPersonFK = SalesPeople.SalesPersonID 
FROM Records 
     INNER JOIN SalesPeople 
      ON PseudoSalesPersonID = RowNumber 

ALL COMBINED IN AN SQL FIDDLE

+0

+1感謝您對sql的解釋 – Zaki

1

它主要是作爲DeeMac說。但是,如果您的Record是一個對象(即它具有所有工作細節或其銷售或交易),則需要將該表分開。有一個表Record與該特定對象的所有細節。另有一張銷售員,其中包含關於銷售人員的所有詳細信息。 (在一個好的設計,你只會增加該表中的位置的特定業務相關的屬性,所有的個人細節將在不同的表去)

現在對於你的問題,你可以建立兩個獨立的表。一個是Record_Assignment,您將在中指定Salesman。該表將保存所有活動作業。另一張表將是Archived_Record_Assignment,它將保存所有過去的工作。你將所有完成的工作移到這裏。

對於工作的平等分配,你說你想圓分配。我不確定您是否想在所有可用的銷售人員或只有一定數量的人員中進行工作。通常分配由團隊給出。用你想分配工作的銷售人員的銷售人員ID(如果你有多個團隊在他們自己分配的工作區域或顧客上工作,那麼添加團隊ID)創建一個表格(如表SalesTeam)。如果要分配新作業,請在Record_Assignment表中查詢最後一條記錄,獲取銷售員標識並將作業分配給SalesTeam表中的下一個銷售員。分配將通過業務邏輯(編碼)完成。

我沒有完全意識到您的情況。這些都是我的猜測,所以如果你根據你的情況看到什麼東西,讓我知道。

祝你好運!

+0

+1感謝您的解釋 – Zaki