C# 数据库结构,用户+;用户类型,其中用户可以是多个类型
我目前有一个用户表,C# 数据库结构,用户+;用户类型,其中用户可以是多个类型,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我目前有一个用户表,tblUser和一个用户类型表,tblUserTypes 两者通过tblUser中的外键链接进行链接。。。fkUserTypeID 因此,目前用户只能是一种类型 但是,在某些情况下,用户可以是多种类型的。。。例如,一个客户以及一个供应商 对我来说,显而易见的解决方案是在tblUser和tblUserTypes之间创建一个新表,tblUser\u UserTypes,这是一个桥接表: [tblUser] ---< [tblUser_UserTypes] >--- [
tblUser
和一个用户类型表,tblUserTypes
两者通过tblUser中的外键链接进行链接。。。fkUserTypeID
因此,目前用户只能是一种类型
但是,在某些情况下,用户可以是多种类型的。。。例如,一个客户
以及一个供应商
对我来说,显而易见的解决方案是在tblUser
和tblUserTypes
之间创建一个新表,tblUser\u UserTypes
,这是一个桥接表:
[tblUser] ---< [tblUser_UserTypes] >--- [tblUserTypes]
硬编码数据透视查询(如果每个公司有多个类型,则为单行,但公司类型不是动态的)
动态透视查询(每个公司多行,处理动态公司类型)
用户和用户类型之间确实存在多对多关系,我建议您继续这样做并实现它 如果在某些情况下需要看到它变平,可以使用视图或存储过程来适应 如果要继续使用BCP导入,您可以始终将BCP导入到一个暂存表中,然后使用存储的proc填写3个表。无论如何,这样做可能更安全
保持完全实现多对多关系将为您的应用程序提供最大的灵活性,并防止您在获得新安全角色的新要求时需要不断修改用户表 首先,请不要把愚蠢的
tbl
前缀放在表格上。那还能是什么,风景?那又怎么样?你还是要把它当作一张桌子。只需将其称为dbo.Users
。另外,在批量导入新用户时,如何唯一地将用户标识为新用户?如果您导入一个名为John Smith的新客户,该客户是否与名为John Smith的现有供应商是同一个John Smith?最后,同一用户多次返回会有什么问题?您可以始终按用户类型进行筛选,或者只让应用程序/表示层为同一用户折叠多行。您是否也在用户定义的存储过程前面加上sp_uuu
?我想旧习惯很难改掉。。。我还是给一切加前缀!很多年前就被教授了这一点,在阅读任何类型的代码、存储过程、c#代码时都会有所帮助。。。txtUser是一个文本框,strUser是一个字符串,tblUser是一个表。也许是从记事本写代码的时代开始的,那时所有的东西都是黑色文本。你说得对。我很懒,试图避免一路这样做。。。我已经开发了很多代码,这个核心实体结构的改变将极大地改变这条船!。。。但我不得不把这件事归咎于糟糕的计划,并承担责任。我将按照您的建议执行:BCPing文件到一个临时表中,然后从那里处理它。将发布一个带有PIVOT查询结构的答案,我计划使用该结构在需要的地方将数据展平。。。可能会帮助别人。
select * from tblCompany
left join tblCompany_CompanyType on fkCompanyID = pkCompanyID
left join tblCompanyType on fkCompanyTypeID = pkCompanyTypeID
where tblCompany.fkEventID = 1
select * from (
select tblCompany.*,tblCompanyType.CompanyType from tblCompany left join
tblCompany_CompanyType on fkCompanyID = pkCompanyID
left join tblCompanyType on fkCompanyTypeID = pkCompanyTypeID
where tblCompany.fkEventID = 1
) AS sourcequery
Pivot (count(CompanyType) for CompanyType IN ([Customer],[Supplier],[Something Else])) as CompanyTypeName
DECLARE @cols AS NVARCHAR(MAX)
DECLARE @sql AS NVARCHAR(MAX)
SET @cols = STUFF(
(SELECT N',' + QUOTENAME(CompanyType) AS [text()]
FROM (
select CompanyType from tblCompanyType
where fkEventID = 1
) AS Y
FOR XML PATH('')),
1, 1, N'');
SET @sql = N'SELECT * FROM (
select tblCompany.*,tblCompanyType.CompanyType from tblCompany left join tblCompany_CompanyType on fkCompanyID = pkCompanyID
left join tblCompanyType on fkCompanyTypeID = pkCompanyTypeID
where tblCompany.fkEventID = 1
) AS sourcequery
Pivot (count(CompanyType) for CompanyType IN (' + @cols + ')) as CompanyTypeName
order by pkCompanyID'
EXEC sp_executesql @sql;