sql-server - 多个主键连接2个表
问题描述
我曾经在下面的 UserGroup 表中创建一个额外的 Id 列,然后我意识到这似乎是错误的。
用户:
Id | Name |
--------------------
1 | Tim |
2 | Willy |
3 | Mary |
4 | Jonathan |
5 | Mary |
团体:
Id | Name |
------------------
1 | Bees |
2 | Ants |
用户组:
Id | UserId | GroupId |
--------------------------------
1 | 1 | 1 |
2 | 2 | 1 |
3 | 3 | 2 |
4 | 4 | 2 |
5 | 5 | 2 |
那么,您能否就以下问题向我澄清一下:
1)由于 UserGroup 表中可能有一个 UserId - GroupId 对,因此使用额外的 Id 列肯定是多余的,不需要使用此 Id 列,是这样吗?是否有特殊情况需要使用这个额外的 Id 列?
2)删除UserGroup表中的Id列,我需要将两列都设为PK。那么,我怎样才能在 EF Code First 中做到这一点?下面的定义是真的吗?
public class UserGroup
{
[Key]
public int UserId { get; set; }
[Key]
public int GroupId { get; set; }
}
解决方案
您上面的任何一种解决方案都会有一个用例(有或没有 Id 列)。通常,如果表的目标是简单地关联两组数据,则不需要新的 Id,您可以使用复合键来定义 UserGroup 的 Id。可以在此处找到阅读内容:https ://docs.microsoft.com/en-us/ef/core/modeling/keys?tabs=data-annotations 。看起来您可能必须使用 Fluent API 而不是本文档中的数据注释。
还有另一种情况,在为用户和组形成 M 到 N 连接时,您可能需要一个 Id 列。如果您计划将任何数据连接到该连接,则使用 Id 来创建从其他表到用户组的外键会更容易。特别是在您的情况下,我认为可能会在您创建 UserGroups 后不久引入 UserGroupPermissions。您可以为此 ID 设置一个非聚集标识列,但我不推荐它。如果您希望表具有带有 Id 的记录,最好尽可能将其用作聚集索引和主键。
推荐阅读
- retention - 留存率 - 如何对待回头客
- ios - 小按钮快速覆盖大按钮
- python - 如何删除 PySpark DataFrame 的第一行
- javascript - 更改数据表中单击的行的颜色
- drupal-8 - “无法检索分析数据。请重试。”
- c - 如何从线程返回后立即获得返回值,具有多个线程C?
- linux - 如何从 docker.io 切换到 quay.io?
- javascript - 仅使 v-list 内的按钮可点击,同时禁用 v-list-item 内容
- amazon-web-services - 为什么即使禁用了 KMS 密钥,我仍然能够在 EC2 中读取加密的 EBS 卷数据?
- spring-integration - 使用 @Valid 将 JSON 集成到对象