如何设计具有多个需要与公共表建立关系的表的数据库?

问题描述 投票:0回答:1

如果 Table1 与 CommonTable 具有一对多关系,我会将其定义为 Table1.Id = CommonTable.Table1Id。

如果我需要创建与 CommonTable 具有相同一对多关系的 Table2,该怎么办?

我会吗:

  1. 创建第二个表:Table1_CommonTable 和 Table2_CommonTable
  2. 向 CommonTable 添加第二个 Id 列和外键约束:CommonTable.Table1Id 和 CommonTable.Table2Id,知道每条记录只有一个或另一个外键值
  3. 添加第二个外键约束,即 ParentTableName 列,并为两者使用单个 Id 列:将 Table1Id 替换为 ParentId 并链接到 Table1.Id 和 Table2.Id,并将 ParentTableName 设置为父表的名称

在以下示例中,附件记录的创建源自客户记录,但如果它可以源自 N+1 种不同的记录类型怎么办?:

public async Task<ActionResult> Create(int? clientId)
{
    if (clientId == null)
    {
        return NullIdActionResult("client", ControllerName, AreaName);
    }

    var clientModel = await _db.Clients.FindAsync(clientId);

    if (clientModel == null)
    {
        return ModelNotFoundActionResult("client", clientId.ToString(), ControllerName, AreaName);
    }

    var vm = new AttachmentViewModel
    {
        Attachment = new Attachment
        {
            ClientId = clientModel.Id
        },
        Mode = Enums.Mode.Add
    };

    return View($"{ViewBase}/Form.cshtml", vm);
}
sql-server foreign-keys relational-database
1个回答
0
投票

如果不了解这些

one-to-many
关系的本质,就有点难以理解。如果我猜对了,你会遇到一个场景,其中有
Attachment
(你在问题开头所命名的
CommonTable
)引用了
Client
。您希望将同一个表用于与其他实体相关的
Attachments

在这种情况下,最佳选择将取决于您使用的 ORM。

带有多个

X_Attachment
表的选项 #1 看起来最糟糕:你必须支持多个几乎相同的表,我不知道是否可以使用任何 ORM 进行映射。

选项 #2,在

Attachment
表上有多个外键,是最简单的,并且在您只有很少可能的“父项”的情况下可以很好地工作。但是,如果您有太多可能的“父母”,那么添加和管理所有这些键会看起来很丑并且会让人头疼。

选项 #3,带有

ParentId
ParentType
如果你有很多选项
ParentType
,那将是我的选择。虽然我不认为您可以在此配置中设置外键,但您仍然可以添加触发器以确保数据完整性。

© www.soinside.com 2019 - 2024. All rights reserved.