Создание запроса DAO с множеством отношений «один ко многим»? - PullRequest
1 голос
/ 24 января 2010

Я занимаюсь разработкой веб-приложения на PHP и MySQL. У меня есть сущность с именем «Пользователь», которая имеет внутри себя множество отношений «один ко многим» (с другими объектами) (список адресов, список адресов электронной почты, список номеров телефонов и т. Д.). Эти многочисленные адреса, электронные письма, телефонные номера предоставляются пользователю через соединительные таблицы в базе данных (user_link_addresses, user_link_emails и т. Д.).

Сейчас я пытаюсь создать эффективный DAO для сущности User, в частности методы readUserById ($ userId) и readAllUsers (). Однако, так как я любитель sql и паттернов DAO, у меня возникают проблемы с правильным созданием этого DAO.

Мне сказали, что для эффективности сети важно держать ваш DAO в одном запросе, который считывает всю информацию за раз, а затем может быть соответствующим образом сопоставлен с этим объектом. Это имеет смысл, но у меня возникают проблемы при генерации одного запроса, который содержит всю необходимую информацию и может быть правильно сопоставлен с моей сущностью.

Прямо сейчас я могу получить эту информацию, выполнив несколько запросов в цикле после получения пользователей ... Мне просто не нравится эта идея (и я уверен, что она не верна). Кроме того, я знаю, как делать соединения с таблицами соединений - просто не с чем-то таким сложным, и это также должно быть правильно сопоставлено.

НАЗВАНИЯ И ПОЛЯ

ТАБЛИЦА: пользователь ПОЛЯ: user_id, имя пользователя, пароль

ТАБЛИЦА: адрес НАПРАВЛЕНИЯ: address_id, улица, город, штат, почтовый индекс, тип

ТАБЛИЦА: электронная почта ПОЛЯ: email_id, email, введите

ТАБЛИЦА: номер телефона ПОЛЯ: номер_телефона_ид, код_области, номер_фона, тип

- СОЕДИНИТЕЛЬНЫЕ СТОЛЫ ДЛЯ АССОЦИАЦИЙ -

TABLE: user_link_address ПОЛЯ: user_id, address_id

TABLE: user_link_email ПОЛЯ: user_id, email_id

TABLE: user_link_phone_number ОБЛАСТИ: user_id, phone_number_id

Во всяком случае, вся помощь очень ценится,

Steve

1 Ответ

0 голосов
/ 24 января 2010

Иногда стоит включить ассоциации в запросы, а иногда нет. Существует действительно удобный плагин для Ruby on Rails, который анализирует ваше приложение во время его работы и сообщает, какие запросы должны включать связанные модели.

Вы можете попробовать что-то вроде:

SELECT *
    FROM `user` 
    INNER JOIN `user_link_addresses`
        ON `user`.id = `user_link_addresses`.user_id
    INNER JOIN `user_link_foo`
        ON `user`.id = `user_link_foo`.user_id

Если вы сообщите мне все имена и поля таблиц, я могу помочь вам написать более конкретный запрос.

...