sql数据库设计联合数据类型?

lg40wkob  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(306)

关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。

11个月前关门了。
改进这个问题
这可能是一个基本的问题,但我很好奇用联合类型设计数据库最合理的“首选”方法是什么。
我的意思是考虑一张table Post 只有一个附加内容,附加内容可以是 video , audio , pdf , text 或者别的什么。规范化的方法是为每种内容类型创建一个表。但是需要有一个连接表来查询所有其他表 type 指示内容类型的字段。
这意味着在查询初始表时需要查询其中的每一个表。
处理这个问题的另一种方法是使用厨房Flume content 带有类型字段的表。
我这么问是因为我对数据库设计不是特别精通。我很好奇这种数据结构的正常模式是什么。

zfciruhq

zfciruhq1#

这种“其中之一”的建模很棘手。有些数据库内置了对这种功能的支持,比如继承。
一种方法是有一个 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 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 确保类型匹配。

相关问题