设计在不同条件下具有不同字段的 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_summary
。 audio_source
应为空。
当会议记录的类型为 audio
时,它必须有一个 audio_source
并且字段 meeting_content
和 meeting_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_text
和 note_audio
进行的所有左外连接操作。这种方法可以让您跳过 enum
,因为您始终可以通过检查连接的结果来确定它是哪种注释。
我需要有关创建 table 的建议,其中根据条件会有不同的字段。我是 psql 的新手,所以我真的不知道我走的路是否正确,如果有任何提示/建议,我将不胜感激!
目前我有一个 table 来表示一个 meeting_note
,它可以是录音或文本。
当会议记录的类型为 text
时,它必须有一个 meeting_content
,并且可以有一个可选的 meeting_summary
。 audio_source
应为空。
当会议记录的类型为 audio
时,它必须有一个 audio_source
并且字段 meeting_content
和 meeting_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_text
和 note_audio
进行的所有左外连接操作。这种方法可以让您跳过 enum
,因为您始终可以通过检查连接的结果来确定它是哪种注释。