我正在设计这个数据库和c#app,记录被保存到数据库中。现在说我们有三个销售人员,每个人都应该在严格的轮换中分配一个记录,这样他们就可以处理相同数量的记录。
到目前为止,我所做的是创建一个名为Records
和一个SalesPerson
的表,记录会将销售人员id
作为外键,而另一列则会说明哪个代理人被分配给并将增加此列。
你认为这是一个好的设计,如果没有,你能提出任何想法吗?
答案 0 :(得分:2)
为此,我将使用分析函数ROW_NUMBER
和NTILE
(假设您的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
更新记录CTEUPDATE Records
SET SalesPersonFK = SalesPeople.SalesPersonID
FROM Records
INNER JOIN SalesPeople
ON PseudoSalesPersonID = RowNumber
答案 1 :(得分:1)
这很令人困惑,因为我怀疑你使用数据库术语'record'以及对象/实体'Record'。
在一个表中具有唯一标识符并且在另一个表中也具有外键的简单概念很好,但是,是的。它避免了冗余。