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



我需要根据条件创建不同字段的表的建议。我对psql很陌生,所以我真的不知道我是否走对了路,我会感谢任何提示/建议!

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

当会议记录类型为text时,必须有一个meeting_content,可以有一个可选的meeting_summaryaudio_source应为null

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

我还在考虑创建两个表-一个用于类型音频和另一个用于文本,但是created_at上有一个unique约束,它表示像5月11日这样的日期。我不确定如何在两个表之间添加这个约束。

下面是表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))

感谢任何帮助。提前谢谢你!

解决这个问题有两种常见的方法——每种类型使用一张表和每种类型使用一张表。你在问题中描述的方法是一个表,所有的东西;你的定义很准确。

下面是如何实现每个类型一个表的解决方案:表用于所有音符,然后为每个音符子类型创建一个表,如下所示:

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,因为您总是可以通过检查连接的结果来确定它是哪种注释。

相关内容

最新更新