设计在不同条件下具有不同字段的 table 的最佳做法是什么?

What's the best practice to design a table that would have different fields on different conditions?

我需要有关创建 table 的建议,其中根据条件会有不同的字段。我是 psql 的新手,所以我真的不知道我走的路是否正确,如果有任何提示/建议,我将不胜感激!

目前我有一个 table 来表示一个 meeting_note,它可以是录音或文本。

当会议记录的类型为 text 时,它必须有一个 meeting_content,并且可以有一个可选的 meeting_summaryaudio_source 应为空。

当会议记录的类型为 audio 时,它必须有一个 audio_source 并且字段 meeting_contentmeeting_summary 应该为空。

我也在考虑创建两个 tables - 一个用于音频类型,另一个用于文本,但是 created_at 上有一个 unique 约束,代表像五月这样的日期11号。我不确定如何在两个 table 之间添加此约束。

这里是 table meeting_note

的字段
id serial PRIMARY KEY, 
meeting_id integer REFERENCES meeting(id),
meeting_note_type enum('audio', 'text') NOT NULL, 
meeting_content text, 
summary varchar(255),
created_at varchar(10) NOT NULL,
recording_source varchar(255)

和限制条件:

UNIQUE (to_char(created_at, 'YYYY-MM-DD')), 
CHECK (NOT (meeting_note_type = 'text' AND meeting_content IS NULL)), 
CHECK (NOT (meeting_note_type = 'audio' AND audio_source IS NULL)), 
CHECK (NOT (meeting_content IS NULL AND audio_source IS NULL), 
CHECK (NOT (meeting_content IS NOT NULL AND audio_source IS NOT NULL), 
CHECK (NOT (audio_source IS NOT NULL AND summary IS NOT NULL))

感谢对此的任何帮助。非常感谢您!

有两种常见的方法来解决这个问题——每个类型使用一个 table 和对所有类型使用一个 table。您在问题中描述的方法对所有内容都是 table;你的定义很准确。

这里是如何做一个 table-per-type 解决方案:为所有笔记制作一个“主”table,然后为每个笔记子类型制作一个 table ,像这样:

create table note_master(
    id serial PRIMARY KEY, 
    meeting_id integer REFERENCES meeting(id),
    created_at varchar(10) NOT NULL
)

create table note_text (
    id serial REFERENCES note_master(id),
    meeting_content text, 
    summary varchar(255),
)

create table note_audio (
    id serial REFERENCES note_master(id),
    recording_source varchar(255)
)

要查询您对 note_textnote_audio 进行的所有左外连接操作。这种方法可以让您跳过 enum,因为您始终可以通过检查连接的结果来确定它是哪种注释。