我正在设计这个数据库和 c# 应用程序,将记录保存到数据库中。现在说我们有三个销售人员,每个人都应该被分配一个严格轮换的记录,这样他们就可以处理相同数量的记录。
到目前为止,我所做的是创建一个名为Records
and oneSalesPerson
的表,记录将 salespersonid
作为外键,另一列将说明它分配给哪个代理并将增加该列。
你认为这是一个好的设计,如果不是,你能给出任何想法吗?
我正在设计这个数据库和 c# 应用程序,将记录保存到数据库中。现在说我们有三个销售人员,每个人都应该被分配一个严格轮换的记录,这样他们就可以处理相同数量的记录。
到目前为止,我所做的是创建一个名为Records
and oneSalesPerson
的表,记录将 salespersonid
作为外键,另一列将说明它分配给哪个代理并将增加该列。
你认为这是一个好的设计,如果不是,你能给出任何想法吗?
为此,我将使用分析函数ROW_NUMBER
和NTILE
(假设您的 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
使用此示例数据,第一步是找到可将记录分配给的可用销售人员数量:
DECLARE @Count INT = (SELECT COUNT(*) FROM @SalesPerson WHERE Active = 1)
接下来使用 CTE 包含窗口函数(因为它们不能在连接子句中使用)
;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
)
最后用实际的销售人员 ID 而不是伪 ID 更新记录 CTE
UPDATE Records
SET SalesPersonFK = SalesPeople.SalesPersonID
FROM Records
INNER JOIN SalesPeople
ON PseudoSalesPersonID = RowNumber
它主要是像 DeeMac 所说的那样。但是,如果您Record
是一个对象(即它具有所有工作详细信息或其销售或交易),那么您需要将该表分开。有一张Record
包含该特定对象的所有详细信息的表格。有另一个表“销售员”,其中包含有关销售人员的所有详细信息。(在一个好的设计中,您只需在此表中添加职位的特定业务相关属性。所有个人详细信息将放在不同的表中)
现在对于您的问题,您可以构建两个单独的表。一个是Record_Assignment
您将 a 分配给Record
a 的位置Salesman
。该表将保存所有活动作业。另一张桌子将Archived_Record_Assignment
存放所有过去的工作。您将所有已完成的作业移至此处。
对于平等的工作分配,你说你想要循环分配。我不确定您是想在所有可用的销售人员之间分配工作,还是只分配给特定数量的销售人员。通常任务是由团队分配的。创建一个表(比如 table SalesTeam
),其中包含您要分配工作的销售人员的销售员 ID(添加团队 ID,如果您有多个团队在各自分配的工作区域或客户上工作。通常是这种情况)。当您要分配新工作时,查询Record_Assignment
表中的最后一条记录,获取销售员 id 并将工作分配给SalesTeam
表中的下一个销售员。分配将通过业务逻辑(编码)完成。
我不完全了解您的情况。这些都是我的猜测,所以如果你根据你的情况看到了什么,请告诉我。
祝你好运!