sql - SQL 数据库设计联盟数据类型?
问题描述
这可能是一个基本问题,但我很好奇设计具有联合类型的数据库的最合理“首选”方式是什么。
我的意思是考虑一个只有一条附加内容的表格,Post
附加内容可以是video
, audio
,或其他类型。规范化的方式是为这些内容类型中的每一个创建一个表。但是需要有一个连接表来查询所有其他表字段指示的内容类型。 pdf
text
type
这意味着在查询初始表时需要查询其中的每一个。
处理此问题的另一种方法是使用带有类型字段的厨房水槽content
桌。
我问是因为我不是特别精通数据库设计。我很好奇以这种方式构建的数据的正常模式是什么。
解决方案
这种类型的“one-of”建模很棘手。一些数据库具有对此类功能的内置支持,例如继承。
一种方法是有一个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
并确保类型匹配。
推荐阅读
- r - 通过引用 R 中的行号跨行汇总
- kotlin - Kotlin Generics - 是否可以获得任何类型的元素的整数位置,如序数方法对枚举定义的类所做的那样?
- javascript - antd table pagination bug
- javascript - Javascript如何根据匹配的id将一个数组的值插入另一个数组?
- r - 按下动作按钮时执行多个动作
- apache - Apache CSP 设置
- r - 如何从 R 中的 shapefile 中提取特征样本?
- npm - 将 Tweakpane 导入为 npm 模块
- python - 用漂亮的汤刮取数据并写入 csv 文件
- c++ - 如何将 shared_ptr 提供给应将各种数据类型添加到向量的模板函数?