如何针对单个父表设计多个子表?

时间:2012-05-30 21:18:42

标签: mysql database database-design

如果有人能告诉我采用这种方法的正确方法,我将不胜感激:

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

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

我是否正确地认为无论表结构如何都没有简单的方法来查询(并且最好在PHP中进行排序)?将3个公共字段垂直分区为单个表并结合table字段是否有任何优势?

2 个答案:

答案 0 :(得分:2)

这是一个非常难以解决的问题,我自己也在研究过。不幸的是,我没有一个好的答案。您可以使用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)

...

答案 1 :(得分:0)

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

希望它有所帮助。