2

如果有人能告诉我正确的方法是什么,我将不胜感激:

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

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

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

4

2 回答 2

2

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

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

您的架构将类似于:

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)

...
于 2012-05-30T22:32:57.133 回答
0

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

希望能帮助到你。

于 2012-05-30T21:28:32.287 回答