1

我正在设计这个数据库和 c# 应用程序,将记录保存到数据库中。现在说我们有三个销售人员,每个人都应该被分配一个严格轮换的记录,这样他们就可以处理相同数量的记录。

到目前为止,我所做的是创建一个名为Recordsand oneSalesPerson的表,记录将 salespersonid作为外键,另一列将说明它分配给哪个代理并将增加该列。

你认为这是一个好的设计,如果不是,你能给出任何想法吗?

4

3 回答 3

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

使用此示例数据,第一步是找到可将记录分配给的可用销售人员数量:

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

全部组合在一个 SQL 小提琴中

于 2012-09-20T11:27:56.820 回答
1

这很令人困惑,因为我怀疑您正在使用数据库术语“记录”以及对象/实体“记录”。

不过,在一个表中具有唯一标识符并在另一个表中作为外键具有唯一标识符的简单概念很好,是的。它避免了冗余。

标准化的基础

于 2012-09-20T10:53:56.517 回答
1

它主要是像 DeeMac 所说的那样。但是,如果您Record是一个对象(即它具有所有工作详细信息或其销售或交易),那么您需要将该表分开。有一张Record包含该特定对象的所有详细信息的表格。有另一个表“销售员”,其中包含有关销售人员的所有详细信息。(在一个好的设计中,您只需在此表中添加职位的特定业务相关属性。所有个人详细信息将放在不同的表中)

现在对于您的问题,您可以构建两个单独的表。一个是Record_Assignment您将 a 分配给Recorda 的位置Salesman。该表将保存所有活动作业。另一张桌子将Archived_Record_Assignment存放所有过去的工作。您将所有已完成的作业移至此处。

对于平等的工作分配,你说你想要循环分配。我不确定您是想在所有可用的销售人员之间分配工作,还是只分配给特定数量的销售人员。通常任务是由团队分配的。创建一个表(比如 table SalesTeam),其中包含您要分配工作的销售人员的销售员 ID(添加团队 ID,如果您有多个团队在各自分配的工作区域或客户上工作。通常是这种情况)。当您要分配新工作时,查询Record_Assignment表中的最后一条记录,获取销售员 id 并将工作分配给SalesTeam表中的下一个销售员。分配将通过业务逻辑(编码)完成。

我不完全了解您的情况。这些都是我的猜测,所以如果你根据你的情况看到了什么,请告诉我。

祝你好运!

于 2012-09-20T13:43:38.510 回答