【问题标题】:How to design multiple child tables against a single parent table?如何针对单个父表设计多个子表?
【发布时间】:2012-06-05 04:03:11
【问题描述】:

如果有人能告诉我解决这个问题的正确方法,我将不胜感激:

  • 我有一个父表,主键为master_id
  • 我有五个与 master_id 关联的子表,它们是一对一的关系,它们记录语义上不同类型的数据(并且不适合抽象)
  • 每个子表中唯一的公共字段是master-id(外键)、created_by(用户ID)、created_time(时间戳)。

目的是在网页上按时间顺序发布与主 ID 相关联的每个子行(想象一个论坛帖子样式显示),PHP 构建每个“帖子”(即行)略有不同,具体取决于子表(以及因此可用的数据字段)。

我是否认为无论表结构如何都没有简单的方法来查询它(并且最好在 PHP 中完成排序)?将 3 个公共字段垂直分区到单个表中并结合 table 字段有什么优势吗?

【问题讨论】:

  • 视图会做你需要它做的事情吗?我遇到了类似的情况,发现与其尝试对数据本身进行规范化,不如通过视图将其编译成我想要的格式,并保持一切原样。
  • 您可以使用UNION 子查询,在父查询中对组合结果进行排序。您可能必须在每个查询中插入额外的列,以便结果集对齐。请参阅this answer 了解更多信息。
  • @eggyal 我读了你的其他答案,谢谢。我最终决定反对它,因为 1. 如果添加更多子表,每个选择结果中的空列将变得越来越难以维护,并且 2. 每个表都需要查询,这是性能开销

标签: mysql database database-design


【解决方案1】:

这是一个非常难以解决的问题,我自己解决了这个问题。不幸的是,我没有一个好的答案。您可以使用 UNION 和各种类型的 JOIN,但您可能会严重影响数据库的性能。另外,您会遇到诸如您想要最近 30 个按时间顺序排列的条目之类的问题。您必须在每个子表中查询 30 个条目(可能总共 150 个条目)并在代码中对它们进行排序,因为您不知道哪些子表具有最近的 30 个条目。 150 行只是为了拉 30 行,废话。

老实说,我发现实现这种事情的最佳方法是有一个表,可能是您的主表,有专门用于您希望从子表中显示的内容的列。例如,在您的主表中有类似于 master_idcreated_bycreated_timenotification_text 的列(例如,如果您尝试实现 Facebook 的时间线之类的东西)。您可以在子表上设置触发器,以便当您将数据插入其中之一时,它也会自动填充主表中的数据。然后,当您显示时间线时,您只需查询主表,而无需打扰子表。

您的架构将类似于:

Table master
- master_id
- created_by
- created_time
- notification_text

Table child1
- id
- master_id
- data1 (used to generate notification_text in master)

Table child2
- id
- master_id
- data21 (collectively used to generate notification_text in master)
- data22 (collectively used to generate notification_text in master)
- data23 (collectively used to generate notification_text in master)

...

【讨论】:

  • 嗨,King - 我决定尝试这种面向非规范化的方法。我稍微扩展了这个想法,增加了“notification_title”、“notification_content”等列,以便在页面上有更多的灵活性。另一种解决方案也可能是使用带有表字段的主表来获取最新的 id 及其位置,然后从 php.ini 发送重复查询。不过也不理想。
  • 我感受到了你的痛苦。我正在为一个游戏社区开发一个类似 Facebook 的社交网站,我遇到了这个确切的问题。非规范化的优点是性能——您只需对一张表运行一次查询,并且使用索引,它可以非常有效。在我的项目中,我认为这是为所有不同类型的事件可能触发通知的绝对数量的其他表的方法。不幸的是——或者也许幸运的是——我认为任何主流数据库都不支持对表的间接引用,就像我们在理想情况下所需要的那样。
【解决方案2】:

你做明星模特怎么样?它通常用于创建数据仓库,但是您可以尝试在解决方案中使用类似的东西。对星型不熟悉的可以看更多here

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2021-01-23
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多