销售人员记录

时间:2012-09-20 10:49:51

标签: c# sql database database-design

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

到目前为止,我所做的是创建一个名为Records和一个SalesPerson的表,记录会将销售人员id作为外键,而另一列则会说明哪个代理人被分配给并将增加此列。

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

2 个答案:

答案 0 :(得分:2)

为此,我将使用分析函数ROW_NUMBERNTILE(假设您的RDBMS支持它们)。这样,您可以为每个可用的销售人员分配一个从1向上递增的伪id,然后随机分配每个未分配的记录,其中一个伪ID在销售人员之间平均分配。使用伪ID而不是实际ID允许SalesPersonID字段不连续。 e.g。

-- 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来包含窗口函数(因为它们不能在join子句中使用)

;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

<强> ALL COMBINED IN AN SQL FIDDLE

答案 1 :(得分:1)

这很令人困惑,因为我怀疑你使用数据库术语'record'以及对象/实体'Record'。

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

Basics of normalisation