Сложные присоединения вызывают высокую связь и проблемы с техническим обслуживанием? -- coupling пол Связанный проблема

Do complex JOINs cause high coupling and maintenance problems?


0
vote

проблема

русский

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

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

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

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

Английский оригинал

Our project has ~40 tables with complex relations.A colleague believes in using long join queries which enforces me to learn about tables outside of my module but I think I should not concern about tables not directly related to my module and use data access functions (written by those responsible for other modules) when I need data from them. Let me clarify:

I am responsible for the ContactVendor module which enables the customers to contact the vendor and start a conversation about some specific product. Products module has it's own complex tables and relations with functions that encapsulate details (for example i18n, activation, product availability etc ...). Now I need to show the product title of some product related to some conversation between the vendor and customers. I may either write a long query that retrieves the product info along with conversation stuff in one shot (which enforces me to learn about Product tables) OR I may pass the relevant product_id to the get_product_info(int) function.

First approach is obviously demanding and introduces many bad practices and things I normally consider fault in programming. The problem with the second approach seems to be the countless mini queries these access functions cause and performance loss is a concern when a loop tries to fetch product titles for 100 products using functions that each perform a separate query. So I'm stuck between "don't code to the implementation, code to interface" and performance. What is the right way of doing things ?

UPDATE: I'm specially concerned about possible future modifications to those tables outside of my module. What if the Products module decided to change the way they are doing things? or for some reason modify the schema? It means some other modules would break or malfunction until the change is integrated to them. The usual ripple effect problem.

</div
  

Список ответов

0
 
vote

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

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

 

What about working with views here?

Instead of calling the get_product_info function, make every module maintainer provide views to that module, such as a product_info_view, and then use this view with your query. Like this you do not have to be conserned about the internals (tables) of such view but will still get the performance advantage, as the datbase engine will simplify the final query containing your code and the view.

</div
 
 
 
 
0
 
vote

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

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

<Сильный> ответ на комментарий: не обязательно. Скажем, модуль продукта добавлен 5 новых столбцов. Либо вы уже не использовали их, и поэтому не присоединяйтесь к ним или извлеките их, и не будут затронуты независимо от того, какой метод вы выбрали, или вам нужны, и приходится писать новый код для того, как иметь дело с ними. Во всяком случае, изменения на вашей стороне будут такими же, какой метод вы выбрали. Скажите модуль продукта переименован или удалил 3 столбца. Тогда ваша сторона должна будет изменить, как она обрабатывала возвращенные значения, независимо от того, как был написан интерфейс. Я вижу, что вы получаете, но внизу, IMHO, это то, что если вы используете поля, связанные с изменением, вы должны сделать изменения кода. Если поля не используются вами, вы этого не используете. Вы упоминаете, что вы не должны существовать, если вы хотите использовать только столбцы, которые вы хотите использовать select * from tbl .

 

I can see both sides of the question. However, given that you say there are only about 40 tables, it seems to me that the complexity of interacting with, say, 30 other tables outside your area of expertise is minimal. I'd vote for writing the queries that do the complex joins. After all, other than knowing the exact columns in the table, which should be easy, all you really need to know is any special relationships or special meanings that those tables use.

But the other fact that might make the decision for me is what are the performance requirements? If the system is currently fast enough, and the hardware and table sizes are such that it will still be fast enough using separate queries for each table, go ahead and do it using the 2nd approach if it makes everyone's life easier. But on the other hand, if anyone has ever complained about speed, or if the tables are likely to grow without bound in the future, or your number of users is likely to increase, do it using the method which has the best hope of being faster.

RESPONSE TO COMMENT: Not necessarily. Say the product module added 5 new columns. Either you were not using those already, and therefore not joining to them or retrieving them, and would not be affected regardless of which method you chose, or you need them and have to write new code for how to deal with them. At any rate, the changes to your side would be the same whichever method you chose. Say the Product module renamed or deleted 3 columns. Then your side would have to change how it handled the returned values, independent of how the interface was written. I see what you are getting at, but the bottom line, IMHO, is that if you use fields involved in the change, you have to make code changes. If the fields are not used by you, you don't. The "ripple affect" you mention should not exist if you only fetch columns you want, as opposed to using select * from tbl queries.

</div
 
 
   
   
0
 
vote

Правильный способ выполнения такого рода вещей (источник постоянства / источника данных / ORM) очень хорошо описан Мартином Фаулером в его удивительной книге: Шаблоны архитектуры приложения предприятия. Книга должна прочитать для всех в разработке предприятия.

 

The correct way of doing this kind of stuff (Persistence / Data Source / ORM) is very well described by Martin Fowler in his amazing book: Patterns of Enterprise Application Architecture. The book is a MUST read for everyone in enterprise development.

</div
 
 

Связанный проблема

2  MicrovIce Coupling  ( Microservice coupling ) 
Я строю новое приложение с концепциями микросервиса, но я не знаю, как общаться с другим микросервисом без сцепления. Вот мой сценарий. Я хочу показать граф...

35  Сплоченность и развязка, что они представляют?  ( Cohesion and decoupling what do they represent ) 
Что такое сплоченность и развязка? Я нашел информацию о сцеплении, но не о развязке. ...

0  Способ быстрого рубина / алгоритм для парных элементов двух массивов  ( Fast ruby method algorithm to pair elements of two arrays ) 
У меня есть два Сортированные массивы плавающих чисел (обычно 800-1500 элементов), размер двух массивов может быть разным на + -20-30%. Я ищу быстрый метод, ...

4  Как проверить анонимные классы?  ( How to test anonymous classes ) 
Я считаю, что вы должны быть знакомы с этой идиомой, который является своего рода оправдание Java для закрытия <код> //In the "Resource Manager" class publi...

-1  Как разделяют услуги авторизации из других услуг в архитектуре микросервис?  ( How to decouple auth services from other services in microservice architecture ) 
У меня есть набор микросервисов, один из них отвечает за аутентификацию. Все услуги используют общую библиотеку E.g. flask_jwt_exteded и общий секретный клю...

11  Структура веб-приложений на Python для тесной связи DB / GUI?  ( A python web application framework for tight db gui coupling ) 
<Р> Я твердо верю в еретической мысли о тесной связи между серверной и веб-интерфейсе: Я хочу, чтобы существующие, подразумеваемые знания о внутреннем интерфей...

2  Сплоченность и муфта - как определить порог?  ( Cohesion and coupling how does one determine the threshold ) 
Я делаю дальше в сети Java-классы в данный момент, и вот как класс кратко определил это: Сплоченность: цель для высокой сплоченности, в этом случае сплоченн...

5  Java 1.4: Cast примитивный тип для объекта (Сцепление против производительности?)  ( Java 1 4 cast primitive type to object coupling vs performance ) 
<Р> На самом деле это связано с вопросом я спросил раньше, но я остался висеть на этой детали. Я ограничен Java 1.4, и я хочу, чтобы бросить <код> int введите...

1  Как связать объект, который связан с другими - C #, OOD  ( How to tie in an object thats related with others c ood ) 
Я борюсь на приложении консоли блэкджека и нуждаетесь в помощи в разработке / относящихся к моему классу сиденья. Для игры есть шесть мест и сиденье могут и...

0  Когда класс «имеет отношения с другими классовыми объектами  ( When a class has a relationship with other class objects ) 
Скажем, у нас есть автомобиль, колесо и классы тормозов. Автомобиль "имеет" четыре колеса, поэтому, когда создается экземпляр автомобиля, я хочу 4 экземпляра ...

290  В чем разница между слабой связью и жесткой связью в объектно-ориентированной парадигме?  ( What is the difference between loose coupling and tight coupling in the object o ) 
<Р> Может ли один описать точную разницу между свободным соединением и тесной связью в объектно-ориентированной парадигме? ...

36  Как решить нарушения закона Деметра?  ( How to solve the violations of the law of demeter ) 
<Р> Коллега и я разработал систему для наших клиентов, и, по нашему мнению, мы создали хороший чистый дизайн. Но у меня возникли проблемы с некоторыми сцеплени...

4  Автоматический интеллектуальный указатель  ( Auto instantiated smart pointer ) 
Я ищу простой способ уменьшить соединение заголовка в проекте C ++, который в основном приходит в основном из-за (чрезмерно использованный) классный состав, к...

1  Установка зависимостей DLL  ( Enforcing dll dependencies ) 
фон Мое решение состоит из двух проектов: Стандартное приложение Windows dll, которую мое приложение не использует напрямую, но вместо этого вводит ег...

8  Муфта слишком высока - как проектировать этот класс лучше?  ( Coupling is too high how to design this class better ) 
<Р> Запуск FxCop на моем коде, я получаю это предупреждение: <Р> Microsoft.Maintainability: «FooBar.ctor соединен с 99 различные типы из 9 различных пр...

Связанный проблема

2  MicrovIce Coupling 
35  Сплоченность и развязка, что они представляют? 
0  Способ быстрого рубина / алгоритм для парных элементов двух массивов 
4  Как проверить анонимные классы? 
-1  Как разделяют услуги авторизации из других услуг в архитектуре микросервис? 
11  Структура веб-приложений на Python для тесной связи DB / GUI? 
2  Сплоченность и муфта - как определить порог? 
5  Java 1.4: Cast примитивный тип для объекта (Сцепление против производительности?) 
1  Как связать объект, который связан с другими - C #, OOD 
0  Когда класс «имеет отношения с другими классовыми объектами 
290  В чем разница между слабой связью и жесткой связью в объектно-ориентированной парадигме? 
36  Как решить нарушения закона Деметра? 
4  Автоматический интеллектуальный указатель 
1  Установка зависимостей DLL 
8  Муфта слишком высока - как проектировать этот класс лучше?