Asp.net 如何使用SQL将三个表映射到一个表(SQL Server 2012)

Asp.net 如何使用SQL将三个表映射到一个表(SQL Server 2012),asp.net,sql,sql-server,entity-framework,normalization,Asp.net,Sql,Sql Server,Entity Framework,Normalization,我的应用程序涉及测试,有三种不同的 测试:考试,目标和习惯。以下是三种模式(包括一些 此简化示例中的每个字段中缺少列) 其中任何一项都可以在测试表中记录: CREATE TABLE [dbo].[Test] ( [TestId] INT IDENTITY (1, 1) NOT NULL, [ExamId] INT NOT NULL, [Title] NVARCHAR (100) NULL,

我的应用程序涉及测试,有三种不同的 测试:考试,目标和习惯。以下是三种模式(包括一些 此简化示例中的每个字段中缺少列)

其中任何一项都可以在测试表中记录:

CREATE TABLE [dbo].[Test] (
    [TestId]      INT            IDENTITY (1, 1) NOT NULL,
    [ExamId]      INT            NOT NULL,
    [Title]       NVARCHAR (100) NULL,
    [Status]      INT            NOT NULL
);

但我如何绘制这张地图呢?上面的测试表只有一个ExamId,因为最初的考试是我唯一的来源。现在我有三个来源,那么如何将其他两个实体Objective和Custom链接到测试表呢?

因此,到目前为止,测试始终是一个测试,但现在它可以是考试、目标或Custom

一种解决方案是在测试表中使ExamID可为null,并再添加两个可为null的ID ObjectiveID和CustomID

每个测试记录始终只使用一个ID。为了避免错误,您需要编写一个检查约束:

ALTER TABLE dbo.Test ADD CONSTRAINT CK_Test_Type CHECK
(
  (ExamId IS NOT NULL AND ObjectiveID IS NULL AND CustomID IS NULL)
  OR
  (ExamId IS NULL AND ObjectiveID IS NOT NULL AND CustomID IS NULL)
  OR
  (ExamId IS NULL AND ObjectiveID IS NULL AND CustomID IS NOT NULL)
);
另一个选项是不要有三个表Exam、Objective和Custom,而只有一个TestDetail,其中包含一列类型(Exam、Objective或Custom)


两个选项中哪一个更合适取决于三个表的不同程度。

这个测试表怎么样

CREATE TABLE [dbo].[Test] (
    [TestId]      INT            IDENTITY (1, 1) NOT NULL,
    [ExamId]      INT            NULL,
    [ObjectiveId] INT            NULL,
    [CustomId]    INT            NULL,
    [Title]       NVARCHAR (100) NULL,
    [Status]      INT            NOT NULL

    FOREIGN KEY (ExamId) REFERENCES [dbo].[Exam](ExamId)
    FOREIGN KEY (ObjectiveId) REFERENCES [dbo].[Objective](ObjectiveId)
    FOREIGN KEY (CustomId) REFERENCES [dbo].[Custom](CustomId)
);

将列
OjectiveId
CustomId
添加到
Test
中如何?是的,这是一个解决方案,但我不确定是否会选择一个擅长数据建模/规范化的人作为解决方案。我希望有一些专家的选择,因为我认为这一定是一个相当常见的问题。为什么它们是三张表?如果它们都共享相似的模式,
Exam
Objective
Custom
是否应该是出现在单个表列中的值?如果你在为一个组织建模,你会有
MaleEmployees
FemaleEmployees
表格吗?@Damien_The_uncerver-表格都是不同的,正如问题“在这个简化的例子中,每个表格都缺少一些列”中所提到的,“缺少的列”是否不清楚每个表中的内容相同或不同。
CREATE TABLE [dbo].[Test] (
    [TestId]      INT            IDENTITY (1, 1) NOT NULL,
    [ExamId]      INT            NULL,
    [ObjectiveId] INT            NULL,
    [CustomId]    INT            NULL,
    [Title]       NVARCHAR (100) NULL,
    [Status]      INT            NOT NULL

    FOREIGN KEY (ExamId) REFERENCES [dbo].[Exam](ExamId)
    FOREIGN KEY (ObjectiveId) REFERENCES [dbo].[Objective](ObjectiveId)
    FOREIGN KEY (CustomId) REFERENCES [dbo].[Custom](CustomId)
);