【问题标题】:How can I map three tables to one table with SQL (SQL Server 2012)如何使用 SQL (SQL Server 2012) 将三个表映射到一个表
【发布时间】:2014-04-28 11:27:07
【问题描述】:

我的申请涉及测试,有三种不同的 测试:考试、目标和自定义。这是三个模式(有一些 对于这个简化的示例,每个列中都缺少列)

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,因为原来 Exam 是我唯一的来源。现在我有了三个来源,那么如何将其他两个实体 Objective 和 Custom 链接到 Test 表?

【问题讨论】:

  • OjectiveIdCustomId 列添加到Test 怎么样?
  • 是的,这是一种解决方案,但我不确定这是否是一个擅长数据建模/规范化的人选择的解决方案。我希望有一些专家的选择,因为我认为这一定是一个相当普遍的问题。
  • 为什么是三张表?如果它们都共享相似的架构,ExamObjectiveCustom 是否应该不是出现在单个表的 中的?如果你正在为一个组织建模,你会拥有 MaleEmployeesFemaleEmployees 表吗?
  • @Damien_The_Unbeliever - 表都不同,如问题“对于这个简化的示例,每个列都缺少一些列”中所述
  • 不清楚每个表中的“缺失列”是相同还是不同。

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


【解决方案1】:

这个测试台怎么样?

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

【讨论】:

    【解决方案2】:

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

    一种解决方案是在您的测试表中使 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)的列。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 2014-09-20
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      相关资源
      最近更新 更多