C# 销售人员记录

C# 销售人员记录,c#,sql,database,database-design,C#,Sql,Database,Database Design,我正在设计这个数据库和c#应用程序,将记录保存到数据库中。现在假设我们有三个销售人员,每个人都应该被分配一个严格轮换的记录,这样他们就可以处理相同数量的记录 到目前为止,我所做的是创建一个名为Records的表和一个SalesPerson,这些记录将SalesPersonid作为外键,另一列将说明分配给哪个代理,并将增加此列 你认为这是一个好的设计吗?如果不是的话,你能给出一些想法吗?这很令人困惑,因为我怀疑你使用的是数据库术语“记录”以及对象/实体“记录” 不过,在一个表中有一个唯一标识符,在

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

到目前为止,我所做的是创建一个名为
Records
的表和一个
SalesPerson
,这些记录将SalesPerson
id
作为外键,另一列将说明分配给哪个代理,并将增加此列


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

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

不过,在一个表中有一个唯一标识符,在另一个表中也有一个外键的简单概念是可以的。它避免了冗余


这相当令人困惑,因为我怀疑您使用的是数据库术语“记录”以及对象/实体“记录”

不过,在一个表中有一个唯一标识符,在另一个表中也有一个外键的简单概念是可以的。它避免了冗余


为此,我将使用分析函数
行数
子行
(假设您的RDBMS支持它们)。通过这种方式,您可以为每个可用的销售人员分配一个从1开始递增的伪id,然后随机为每个未分配的记录分配一个伪id,以便在销售人员之间平均分配它们。使用伪ID而不是实际ID允许
salersonid
字段不连续。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子句中使用)

最后,使用实际销售人员id而不是伪id更新记录CTE

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

为此,我将使用分析函数
行数
NTILE
(假设您的RDBMS支持它们)。通过这种方式,您可以为每个可用的销售人员分配一个从1开始递增的伪id,然后随机为每个未分配的记录分配一个伪id,以便在销售人员之间平均分配它们。使用伪ID而不是实际ID允许
salersonid
字段不连续。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子句中使用)

最后,使用实际销售人员id而不是伪id更新记录CTE

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

正如迪马克所说。但是,如果您的
记录
是一个对象(即,它包含所有的工作细节或它的销售或交易),那么您需要分隔该表。有一个表
记录
,其中包含该特定对象的所有详细信息。另设一张“销售人员”表,列出销售人员的所有详细信息。(在良好的设计中,您只需在此表中添加该职位的特定业务相关属性。所有个人详细信息将放在不同的表中)

现在针对您的问题,您可以构建两个单独的表。一个是
Record\u Assignment
,您将
记录
分配给
销售人员
。此表将保存所有活动作业。另一个表将是
存档的\u记录\u分配
,它将保存所有过去的作业。将所有已完成的作业移到此处

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

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


祝你好运

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

现在针对您的问题,您可以构建两个单独的表。一个是
Record\u Assignment
,您将
记录
分配给
销售人员
。此表将保存所有活动作业。另一个表将是
存档的\u记录\u分配
,它将保存所有过去的作业。将所有已完成的作业移到此处

为了公平分配工作,你说你想要循环分配。我不确定你是想把工作分配给所有的销售人员,还是只分配给特定的人数。作业通常由团队来完成。创建一个表(比如table
SalesTeam
),其中包含要分配工作的销售人员的销售人员id(如果有多个团队在各自分配的工作区域或客户上工作,请添加团队id。通常情况下就是这样)。当您想要分配新工作时,查询
记录\u分配
表中的最后一条记录,获取销售人员id并将工作分配给
销售团队中的下一位销售人员