SQL 数据库设计联合数据类型?
SQL Database Design Union Data Type?
这可能是一个基本问题,但我很好奇 "preferred" 设计一个联合类型的数据库最合理的方法是什么。
我的意思是考虑一个 table Post
,它只有 1 个附加内容,附加内容可以是 video
、audio
、pdf
、text
或其他。规范化的方法是为这些内容类型中的每一种创建一个 table。但是需要有一个连接 table 来查询所有其他 tables type
字段指示内容的类型。
这意味着在查询初始table时,这些都需要被查询。
另一种处理方法是在厨房水槽 content
table 上添加一个类型字段。
我问是因为我不是特别精通数据库设计。我很好奇以这种方式构建的数据的正常模式是什么。
这种 "one-of" 建模很棘手。一些数据库内置了对此类功能的支持,例如继承。
一种方法是有一个 attachments
table 并将所有组合成一个 table。这将包含如下列:
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
的类型,但数据库不会对此进行验证。
另一种方法是更复杂的继承模式,它涉及为每个实体设置单独的 table,并在每个实体中设置一个类型。然后设置一个attachments
table。这看起来像:
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)
其他 table 依此类推。这会建立与 attachments
的外键关系,并确保类型匹配。
这可能是一个基本问题,但我很好奇 "preferred" 设计一个联合类型的数据库最合理的方法是什么。
我的意思是考虑一个 table Post
,它只有 1 个附加内容,附加内容可以是 video
、audio
、pdf
、text
或其他。规范化的方法是为这些内容类型中的每一种创建一个 table。但是需要有一个连接 table 来查询所有其他 tables type
字段指示内容的类型。
这意味着在查询初始table时,这些都需要被查询。
另一种处理方法是在厨房水槽 content
table 上添加一个类型字段。
我问是因为我不是特别精通数据库设计。我很好奇以这种方式构建的数据的正常模式是什么。
这种 "one-of" 建模很棘手。一些数据库内置了对此类功能的支持,例如继承。
一种方法是有一个 attachments
table 并将所有组合成一个 table。这将包含如下列:
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
的类型,但数据库不会对此进行验证。
另一种方法是更复杂的继承模式,它涉及为每个实体设置单独的 table,并在每个实体中设置一个类型。然后设置一个attachments
table。这看起来像:
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)
其他 table 依此类推。这会建立与 attachments
的外键关系,并确保类型匹配。