Как разработать схему базы данных, чтобы связать две таблицы с помощью множества других таблиц - PullRequest
0 голосов
/ 20 января 2011

Хотя я использую Rails, этот вопрос больше касается проектирования баз данных. У меня есть несколько объектов в моей базе данных со схемой, похожей на эту: http://fishwebby.posterous.com/40423840

Если я хочу получить список людей и заказать его по фамилии, это не проблема. Однако, если я хочу получить список людей, упорядоченных по фамилии, зарегистрированных в определенной группе, я должен использовать оператор SQL, который включает несколько объединений в четырех таблицах, что-то вроде этого:

SELECT group_enrolment.*, person.*
FROM person INNER JOIN member ON person.id = member.person_id
INNER JOIN enrolment ON member.id = enrolment.member_id
INNER JOIN group_enrolment ON enrolment.id = group_enrolment.enrolment_id
WHERE group_enrolment.id = 123
ORDER BY person.surname;

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

Другой вариант может состоять в том, чтобы соединить таблицу person со всеми другими таблицами в запросе, включив person_id в другие таблицы, тогда это будет просто одно единственное объединение, например

SELECT group_enrolment.*, person.*
FROM person INNER JOIN group_enrolment ON group_enrolment.person_id
WHERE group_enrolment.id = 123
ORDER BY person.surname;

Но это будет означать, что в моей схеме таблица person объединена с множеством других таблиц. Помимо сложной схемы, кто-нибудь видит в этом какие-либо недостатки?

Буду очень признателен за любые комментарии по этому вопросу - будь то то, что я делаю сейчас (объединение в несколько таблиц), или второе решение, или другое, которое мне не пришло в голову, - лучший путь. 1014 *

Большое спасибо заранее

1 Ответ

3 голосов
/ 20 января 2011

Ну, объединения - это то, что делают базы данных. Сказав это, вы можете рассмотреть возможность распространения естественных ключей в вашей модели, что позволит вам пропустить некоторые таблицы в соединениях. Взгляните на этот пример .

EDIT

Я не говорю, что это будет соответствовать вашей модели (проблеме), но просто для удовольствия попробуйте похожие запросы на что-то вроде этого:

alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...