Вызывают ли сложные СОЕДИНЕНИЯ проблемы со сцеплением и техническим обслуживанием? - PullRequest
0 голосов
/ 18 июня 2010

В нашем проекте ~ 40 таблиц со сложными отношениями. Коллега верит в использование длинных запросов на соединение, что заставляет меня узнавать о таблицах вне моего модуля, но я думаю, что мне не следует беспокоиться о таблицах, не связанных напрямую с моим модулем, и использовать данные Доступ к функциям (написанным ответственными за другие модули), когда мне нужны данные из них. Позвольте мне уточнить:

Я отвечаю за модуль ContactVendor, который позволяет клиентам связаться с продавцом и начать разговор о каком-то конкретном продукте. Модуль products имеет собственные сложные таблицы и связи с функциями, которые инкапсулируют детали (например, i18n, активация, доступность продукта и т. Д.). Теперь мне нужно показать название продукта какого-либо продукта, связанного с разговором между продавцом и покупателем. Я могу либо написать длинный запрос, который извлекает информацию о продукте вместе с материалами разговора за один раз (что заставляет меня узнавать о таблицах продукта), либо я могу передать соответствующий product_id в функцию get_product_info (int).

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

ОБНОВЛЕНИЕ: Я особенно обеспокоен возможными будущими модификациями этих таблиц вне моего модуля. Что, если модуль Продукты решил изменить способ, которым они делают вещи? или по какой-то причине изменили схему? Это означает, что некоторые другие модули будут повреждены или работать со сбоями, пока изменения не будут интегрированы в них. Обычная проблема с волновым эффектом.

Ответы [ 3 ]

0 голосов
/ 18 июня 2010

А как насчет работы с представлениями здесь?

Вместо вызова функции get_product_info заставьте каждого сопровождающего модуля предоставлять представления для этого модуля, такие как product_info_view, а затем использовать это представление с вашим запросом.Таким образом, вам не нужно заботиться о внутренних элементах (таблицах) такого представления, но вы все равно получите преимущество в производительности, так как механизм базы данных упростит окончательный запрос, содержащий ваш код и представление.

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

Правильный способ выполнения такого рода вещей (постоянство / источник данных / ORM) очень хорошо описан Мартином Фаулером в его удивительной книге «Шаблоны архитектуры корпоративных приложений». Книга, которую НЕОБХОДИМО прочитать всем, кто занимается развитием предпринимательства.

0 голосов
/ 18 июня 2010

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

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

ОТВЕТ НА КОММЕНТАРИЙ: Не обязательно. Скажем, в продуктовый модуль добавлено 5 новых столбцов. Либо вы уже не использовали их и, следовательно, не присоединялись к ним и не извлекали их, и на вас это не влияло бы, независимо от того, какой метод вы выбрали, или они вам нужны и вам нужно написать новый код для того, как с ними обращаться. В любом случае, изменения на вашей стороне будут такими же, какой бы метод вы ни выбрали. Скажем, модуль Продукт переименован или удален 3 столбца. Тогда вашей стороне придется изменить способ обработки возвращаемых значений, независимо от того, как был написан интерфейс. Я понимаю, к чему вы клоните, но суть в том, ИМХО, что если вы используете поля, связанные с изменением, вы должны внести изменения в код. Если поля не используются вами, вы не делаете. Упомянутый вами «волновой эффект» не должен существовать, если вы выбираете только нужные столбцы, а не select * from tbl запросов.

...