SQL数据库设计联盟数据类型?[关闭]

问题描述 投票:0回答:1

这可能是一个基本的问题,但我很好奇,设计一个联合类型的数据库,最合理的 "首选 "方式是什么。

我的意思是考虑一个表 Post 其中只有1个附加内容,且附加内容可以是以下类型 video, audio, pdf, text 或其他什么。 规范化的方式是为这些内容类型分别建立一个表。但是需要有一个连接表来查询其他所有的表。type 字段,表示内容的类型。

也就是说,在查询初始表的时候,需要对其中的每一个进行查询。

另一种处理方式是在厨房的水槽中设置一个 content 表上有一个类型字段。

我这样问是因为我对数据库设计不是特别精通。 我很好奇,这样结构的数据,正常的模式是什么?

sql join database-design union
1个回答
0
投票

这种 "一之 "的建模方式是很棘手的。 有些数据库内置了对这种功能的支持,比如继承。

一种方法是有一个 attachments 表,并将所有的表合并成一个表。 这样就会有一些列,如。

  • attachments_id
  • type check type in ('video', 'audio', . . .)
  • 其中任何一个表所需的列。

更常见的是,其中的每一个都会是一个单独的实体,因为描述它们的列会有很大的不同--而且往往有自己的关系。 在这种情况下,针对少数类型的简单方法是为每一个类型单独设置一列,同时有一个约束条件,即最多不能有一个 NULL:

check ( (case when video_id is not null then 1 else 0 end) +
        (case when audio_id is not null then 1 else 0 end) +
        . . .  <= 1
      )

这允许正确声明外键关系。

另一种方法是在此基础上的变体。 假设所有的id列都具有相同的类型,那么使用列。

attachment_type varchar(255) check (attachment_type in ('video', 'audio', . . .),
attachment_id int

类型决定了 id,但数据库不会对此进行验证。

而另一种方法是一种更复杂的继承模式,它涉及到为每个实体建立单独的表,以及每个表的类型。 然后设置一个 attachments 桌子。 这看起来像。

attachments_id int generated always as identity primary key,
attachment_type varchar(255) check (attachment_type in ('video', 'audio', . . .),
unique (type, attachments_id)

然后

video_id int primary key,
type varchar(255) generated always as
foreign key video_id references (type, attachments_id)

以此类推的其他表。 这就建立了一个外键关系到 attachments 并确保类型匹配。

© www.soinside.com 2019 - 2024. All rights reserved.