C# 如何在一列数据库设计中创建多个类型id

C# 如何在一列数据库设计中创建多个类型id,c#,sql,sql-server,asp.net-mvc,linq,C#,Sql,Sql Server,Asp.net Mvc,Linq,我正在设计SQL Server数据库,我必须在一列中创建多个FK 因此,我有这些表格,并在一个表格中创建一个菜单 Table 1 Table 2 Table 3 | Pages | Jobs | News |------------ |--------- |----------- | Pageid | Jobid | NewsId | PageName |

我正在设计SQL Server数据库,我必须在一列中创建多个FK

因此,我有这些表格,并在一个表格中创建一个菜单

Table 1             Table 2       Table 3
| Pages            | Jobs         | News
|------------      |---------     |-----------
| Pageid           | Jobid        | NewsId
| PageName         | JobName      | NewsTitle
| MenuName         | MenuName     | MenuName       
我的目标是在一列中引用这些表格

我有一张这个场景中的表

| MenuGroup
|------------       
| menuGroupId
| MenuName
| RecordeId

那么,我将如何实现规范化数据库设计呢?

我建议您创建另一个表,将这3个表的ID作为外键,然后在MenuGroup表中使用这个新表的主键,您可以使用LEFT JOIN通过新表获取各个表。

在一个表中有多个FK不是坏事,尝试将MenuName列用作FK,这样就不必在数据库中创建额外字段。

Sol 1修复了列数: 这是最标准化的解决方案。您可以按照@Tim的建议创建一个包含可空列的新表

| JoiningTable
|------------      
| Id
| PageId
| JobId
| NewsId
Sol2:动态列数: 虽然我不认为这是一个很好的方法,因为引用完整性在这里丢失了,但是在动态列数的情况下,除了这一个之外,我没有任何其他解决方案。
Type:
|------------      
| TypeId
| Name


JoiningTable
|------------      
| Id
| JoiningId
| TypeId (news,job,pages etc etc)
通过将JoiningTable中的TypeId替换为type字段,可以将这两个表压缩为一个表


NoSQl也可能是一种解决方案,但我没有使用NoSQl的经验,因此我不能向您推荐这方面的任何内容。

使用三种不同的可空列。使用Tim或使用NoSQl/Azure,在同一列中可以有不同的类型。您不能在SQL中使用它。通常,使用字符串值作为PK或FK不是一个好主意。您可以这样做,但您需要确保它具有定义的长度no nvarcharmax,这是具有实体框架的字符串的默认长度,并且您应该确保该列已被索引。只使用整数要容易得多,也不容易出错。