Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据库结构,用户+;用户类型,其中用户可以是多个类型_C#_Asp.net_Sql Server - Fatal编程技术网

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;