2012-05-30 4 views
2

Я был бы признателен, если кто-то может мне посоветовать, что правильный способ подойти к этому:Как создать несколько дочерних таблиц с одной родительской таблицей?

  • У меня есть родительская таблица с первичным ключом master_id.
  • У меня есть пять дочерних таблиц, связанных с master_id, в отношении 1-к-n, которые записывают семантически разные типы данных (и не поддаются абстракции)
  • Единственные общие поля в каждой дочерней таблице master-id (внешний ключ), created_by (user_id), created_time (временная метка).

Цель состоит в том, чтобы опубликовать каждую дочернюю строку, связанную с идентификатором мастера, в хронологическом порядке на веб-странице (представьте себе стиль отображения сообщений в форуме), при этом PHP-здание каждого «сообщения» (то есть строки) несколько отличается в зависимости от на дочерний стол (и, следовательно, поля данных, доступных ему).

Я прав, думая, что нет простого способа запросить это независимо от структуры таблицы (и это упорядочение было бы лучше всего сделано в PHP)? Есть ли преимущество в вертикальном разбиении трех общих полей на одну таблицу в сочетании с полем table?

+0

бы вид сделать то, что вам нужно это делать? Я столкнулся с подобной ситуацией и обнаружил, что вместо того, чтобы пытаться нормализовать данные, я мог бы скомпилировать ее в формат, который мне нужен, и оставить все как есть. – SPFiredrake

+1

Вы можете сделать это, используя подзапрос 'UNION', заказывая комбинированные результаты в родительском запросе. Возможно, вам придется вставлять дополнительные столбцы в каждый запрос, чтобы результаты были выровнены. См. [Этот ответ] (http://stackoverflow.com/a/10324939/623041) для получения дополнительной информации. – eggyal

+0

@eggyal Я прочитал ваш другой ответ, спасибо. В конце концов я решил не возражать, потому что 1.если дополнительные дочерние таблицы когда-либо добавляются, нулевые столбцы в каждом выбранном resulstet будут становиться все более трудоемкими для поддержания, и 2. для каждой таблицы потребуется запрос, который является служебной нагрузкой – videocakes

ответ

2

Это действительно трудная проблема для решения, одна из которых я работал над собой. К сожалению, у меня нет хорошего ответа. Вы можете использовать UNION и различные типы JOIN, но вы потенциально сильно убьете производительность своей базы данных. Кроме того, вы сталкиваетесь с такими проблемами, как, скажем, вам нужны 30 последних хронологических записей. Вам нужно будет запросить каждую дочернюю таблицу на 30 записей (возможно, всего 150 записей) и отсортировать их в своем коде, так как вы не знаете, какие дочерние таблицы имеют последние 30 записей. 150 рядов, чтобы вытащить 30, blech.

Честно говоря, лучшим способом, который я нашел для реализации такой вещи, является наличие таблицы, возможно, вашей главной таблицы, столбцы, специально предназначенные для того, что вы хотите показать из вашей дочерней таблицы. Например, у столбцов в вашей главной таблице есть что-то вроде: master_id, created_by, created_time и notification_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) 

... 
+0

Hi King - я решил попробовать этот подход, ориентированный на денормализацию , Я немного расширил эту идею, чтобы иметь дополнительные столбцы, такие как «notification_title», «notification_content» и т. Д., Чтобы обеспечить большую гибкость на странице. Альтернативным решением может быть также использование основной таблицы с полем таблицы для целей последних идентификаторов и их местоположения, а затем отправки повторных запросов с php. Не идеально, хотя. – videocakes

+1

Я чувствую твою боль. Я работаю над Facebook-подобным сайтом социальной сети для игрового сообщества, и я столкнулся с этой точной проблемой. Преимущество денормализации - производительность - вам нужно только запустить один запрос против одной таблицы, а с помощью индексов он может быть чрезвычайно эффективным. В моем проекте я решил, что это способ пойти на огромное количество других таблиц для всех различных типов событий, возможно, может инициировать уведомления. К сожалению - или, может быть, к счастью, я не думаю, что какая-либо основная база данных поддерживает косвенные ссылки на таблицы, например, в идеальном случае. –

0

А как насчет звезды? Обычно для создания хранилищ данных обычно используется то, что вы можете попытаться использовать в своем решении что-то подобное. Если вы не знакомы с моделью звезды, вы можете увидеть больше here.

Надеюсь, это поможет.

Смежные вопросы