sql - 我应该合并 2 个只有一个字段不同的 sql 表吗

标签 sql entity entity-relationship mysql

我应该将这些表合并为一个表吗?有什么棘手的替代方案吗?

Table Unit for a Template table:


Id (PK)
ParentId
Name
TemplateId (FK)

Table Unit2 for a Testplan table:

Id (PK)
ParentId
Name
TestplanId (FK)

编辑:

为什么不制作这样的表格:

[UnitId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [TemplateId] [int] NULL,
    [TestplanId] [int] NULL,
    [ParentId] [int] NULL,

更新2:

1 Template has N Unit
1 Template has N Testplan
1 Testplan has N Unit

这些是使用一个单位表的关系。但这只能与 Unit 表中的 TemplateId 和 TestplanId 一起使用。

最佳答案

不,不应合并相似但不相关的表。

它们的不同之处在于外键列。没有简单的方法可以使外键有时指向一个表,有时指向另一个表。

在您的更新中,您通过添加两列(每个外键一列)来处理这种情况,并且将它们都设置为可为空。但想象一下,您现在想要要求每个模板都只有一个模板 ID。在您的原始设计中,您可以通过将 TemplateId 列设置为 NOT NULL 轻松实现此目的。但您不能在组合表中执行此操作,因为这会阻止您创建测试计划。

现在想象一下,如果有人添加了一个同时具有 TestplanIdTemplateId 的项目...这是您想要允许的吗?在您的旧设计中这是不可能的,但在您的组合表中这是可以完成的。

这种情况可以通过添加 CHECK 约束来处理,但它会增加额外的复杂性,但几乎没有任何好处。

关于sql - 我应该合并 2 个只有一个字段不同的 sql 表吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11127071/

相关文章:

hibernate - CRUD 使用 Hibernate 但没有任何实体

c# - Entity Framework 总是包含上下文中的数据,即使我不要求它

sql - 可选结构sql

PHP, Yii2 GridView 过滤关系值

mysql - 如果表 B 中的 XYZ 列(校验和)发生更改,则从表 B 更新表 A 中的记录

mysql - 如何调整 UNION ALL 查询?

php - 公共(public)用户个人资料页面

sql - 将文本转换为整数

java - Morphia 在从实体子类更新字段时更改 className

entity-framework - 如何在 Entity Framework (.Net 4.0) 中使用导航属性作为主键?