【问题标题】:What's the best practice to design a table that would have different fields on different conditions?设计在不同条件下具有不同字段的表的最佳实践是什么?
【发布时间】:2021-11-02 05:06:07
【问题描述】:

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

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

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

当会议记录是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))

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

【问题讨论】:

    标签: mysql sql database psql


    【解决方案1】:

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

    这里是如何做一个表格的解决方案:为所有笔记制作一个“主”表格,然后为每个笔记子类型制作一个表格,如下所示:

    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,因为您始终可以通过检查连接结果来确定它是什么类型的注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 2012-06-30
      相关资源
      最近更新 更多