【问题标题】:How to have a `Post` table with multiple possible contents?如何拥有一个包含多个可能内容的“发布”表?
【发布时间】:2021-10-28 19:04:07
【问题描述】:

如何拥有一个包含多个可能内容的Post 表?

例如,帖子可以是问题帖子或池帖子,例如 Facebook 状态帖子。这意味着它们每个都需要数据库中的不同列,但它们仍然是 Post 并且具有相同的列,例如 like countscomments

如果每个帖子类型的差异远超过 20 列,那么如何在不创建第二个帖子表的情况下在 SQL 中构建这种表的正确方法是什么?

【问题讨论】:

    标签: sql database-design


    【解决方案1】:

    使用 post_id 主键、所有“Post”类型共有的所有列以及名为“post_type”的列创建一个 post 表。

    然后,对于每种类型的帖子,为该类型的帖子创建一个表格。这些表中的每一个都应具有“post_id”作为“post”表的主键和外键,以及该帖子类型唯一的所有列。

    您真的不应该尝试对单个表执行此操作。

    【讨论】:

    • 我不明白为什么“这些表中的每一个都应该有“post_id”机器人主键和外键”。我认为它应该只作为外键。你能解释一下这部分吗?
    • 它是一个主键,因为它唯一标识帖子,无论帖子类型是什么。它是一个外键,因为它在每个通用“帖子”记录和每个更具体的“帖子类型”记录之间创建了一对一的关系。创建一对一关系的最简单方法之一是使同一列成为主键和外键。我认为这是在 sql 中实现对象继承的一种方式。您的“post_type”对象中的一个是从 post 对象继承字段,然后扩展 post 对象。
    • 感谢您的清晰解释!我认为相同的Posts 行可以由此模式中的不同表选择。这导致一个Posts 行与多个不同的内容表相关,但应该只有一个。有什么解决办法吗?
    • 我认为防止这种情况的唯一方法是在您的程序逻辑中。我认为数据库中没有办法防止多个帖子类型引用同一个帖子行。您也许可以使用 on insert 触发器,但除非绝对必要,否则我会尽量避免使用触发器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2019-04-28
    • 2013-06-05
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多