我需要根据条件创建不同字段的表的建议。我对psql很陌生,所以我真的不知道我是否走对了路,我会感谢任何提示/建议!
目前我有一个表来表示meeting_note
,它可以是语音记录或文本。
当会议记录类型为text
时,必须有一个meeting_content
,可以有一个可选的meeting_summary
。audio_source
应为null
当会议记录为audio
类型时,它必须有一个audio_source
,meeting_content
和meeting_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_text
和note_audio
的左外连接。这种方法允许您跳过enum
,因为您总是可以通过检查连接的结果来确定它是哪种注释。