具有多个相同的表或具有多个关系的一个表

时间:2018-08-03 13:55:25

标签: sql database-design

我不确定哪种设计最适合我的情况。我有一个公用表(附件),该表将具有许多1:N关系。将来,另一个表最终将与该表建立关系。我认为我有两种选择:

  1. 为每个关系创建一个单独的表(1:N);
  2. 创建一个具有很多关系(0:N)的表;

第一种情况的示例:

CREATE TABLE [Education](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [InstitutionName] [nvarchar](100) NOT NULL,
    [Degree] [nvarchar](100) NOT NULL,
    --other columns
)

CREATE TABLE [EducationAttachment](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [FileName] [nvarchar](4000) NOT NULL,
    [Path] [nvarchar](4000) NOT NULL,
    --other columns
    [EducationId] [int] NOT NULL --1:N foreing key
)


CREATE TABLE [Goal] (
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Objective] [nvarchar](4000) NOT NULL,
    --other columns
)

CREATE TABLE [GoalAttachment](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [FileName] [nvarchar](4000) NOT NULL,
    [Path] [nvarchar](4000) NOT NULL,
    --other columns
    [GoalId] [int] NOT NULL --1:N foreing key
)

--FooTable
--FooAttachment

第二种情况的示例:

CREATE TABLE [Attachment](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [FileName] [nvarchar](4000) NOT NULL,
    [Path] [nvarchar](4000) NOT NULL,
    --other columns
    [EducationId] [int] NULL --0:N foreing key
    [GoalId] [int] NULL --0:N foreing key
    [FooId] [int] NULL --0:N foreing key
)

CREATE TABLE [Education](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [InstitutionName] [nvarchar](100) NOT NULL,
    [Degree] [nvarchar](100) NOT NULL,
    --other columns
)

CREATE TABLE [Goal] (
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Objective] [nvarchar](4000) NOT NULL,
    --other columns
)

--FooTable

最佳设计选择是什么?还是另一个?

1 个答案:

答案 0 :(得分:1)

我更喜欢单个附件表,尤其是因为所有附件都具有相同的列(属性)。

关于它的不好的事情是必须将多个外键添加到附件表中并使它们可以为空,因为附件可以是目标附件也可以是教育附件。为了解决这个问题,您可以使用联接表,并避免在附件表中为所有新型附件添加列。例如:

CREATE TABLE [Attachment](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [FileName] [nvarchar](4000) NOT NULL,
    [Path] [nvarchar](4000) NOT NULL
)

CREATE TABLE [Education_Attachment](
    [Education_Id] [int] IDENTITY(1,1) NOT NULL, --foreing key 
    [Attachment_Id] [int] IDENTITY(1,1) NOT NULL, --foreing key
)

CREATE TABLE [Education](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [InstitutionName] [nvarchar](100) NOT NULL,
    [Degree] [nvarchar](100) NOT NULL,
    --other columns
)

阅读here。在第一种方法中,必须将新的附件属性添加到多个表中。在第二种方法中,您将具有可为空的外键约束。