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

时间:2014-03-21 07:41:05

标签: asp.net sql sql-server entity-framework normalization

我的申请涉及测试,有三种不同的类型 测试:考试,目标和习惯。这是三个模式(有一些 这个简化示例中每列都缺少列)

CREATE TABLE [dbo].[Exam] (
    [ExamId]                      INT            IDENTITY (1, 1) NOT NULL,
    [SubjectId]                   INT            NOT NULL,
    [Name]                        NVARCHAR (50)  NOT NULL,
    ...
);

CREATE TABLE [dbo].[Objective] (
    [ObjectiveId]                 INT            IDENTITY (1, 1) NOT NULL,
    [SubjectId]                   INT            NOT NULL,
    [Name]                        NVARCHAR (50)  NOT NULL,
    ...
)

CREATE TABLE [dbo].[Custom] (
    [CustomId]                    INT            IDENTITY (1, 1) NOT NULL,
    [SubjectId]                   INT            NOT NULL,
    [Name]                        NVARCHAR (50)  NOT NULL,
    ...
)

其中任何一个都可以在Test表中有记录:

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链接到Test表?

2 个答案:

答案 0 :(得分:2)

这个测试表怎么样?

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)
);

答案 1 :(得分:0)

所以到目前为止测试总是考试,但现在可以是考试,目标或自定义。

一种解决方案是在您的测试表中使ExamID成为可空,并添加两个可空的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)。

两个选项中哪一个更合适取决于三个表的差异。