Coupling 复杂连接是否会导致高耦合和维护问题?

Coupling 复杂连接是否会导致高耦合和维护问题?,coupling,Coupling,我们的项目有大约40个具有复杂关系的表。一位同事相信使用长连接查询可以强制我了解模块外的表,但我认为我不应该关心与模块没有直接关系的表,当我需要其他模块的数据时,应该使用负责其他模块的人编写的数据访问函数。让我澄清一下: 我负责ContactVendor模块,该模块使客户能够联系供应商,并就某些特定产品展开对话。产品模块有自己的复杂表和与封装细节的函数的关系,例如i18n、激活、产品可用性等。。。。现在,我需要显示一些产品的产品名称,这些产品与供应商和客户之间的一些对话有关。我可以编写一个长查询

我们的项目有大约40个具有复杂关系的表。一位同事相信使用长连接查询可以强制我了解模块外的表,但我认为我不应该关心与模块没有直接关系的表,当我需要其他模块的数据时,应该使用负责其他模块的人编写的数据访问函数。让我澄清一下:

我负责ContactVendor模块,该模块使客户能够联系供应商,并就某些特定产品展开对话。产品模块有自己的复杂表和与封装细节的函数的关系,例如i18n、激活、产品可用性等。。。。现在,我需要显示一些产品的产品名称,这些产品与供应商和客户之间的一些对话有关。我可以编写一个长查询,一次检索产品信息和对话内容,强制我了解产品表,也可以将相关的产品id传递给get_product_infoint函数

第一种方法显然是苛刻的,并且介绍了许多我在编程中通常认为错误的错误做法和做法。第二种方法的问题似乎是这些访问函数会导致无数的迷你查询,当循环尝试使用每个函数都执行单独查询的函数获取100个产品的产品标题时,性能损失是一个问题。因此,我陷入了代码到实现、代码到接口和性能之间的两难境地。做事情的正确方式是什么


更新:我特别关注未来可能对模块外的表进行的修改。如果产品模块决定改变他们做事的方式怎么办?或者出于某种原因修改模式?这意味着一些其他模块将中断或故障,直到更改集成到这些模块中。通常的连锁反应问题

我可以看到问题的两面。然而,如果您说只有大约40个表,那么在我看来,与您专业领域之外的其他30个表进行交互的复杂性似乎是最小的。我投票支持编写完成复杂连接的查询。毕竟,除了知道表中的确切列(这应该很容易),您真正需要知道的是这些表使用的任何特殊关系或特殊含义

但另一个可能让我做出决定的事实是性能要求是什么?如果系统当前速度足够快,并且硬件和表的大小使得它仍然可以通过对每个表进行单独的查询来达到足够快的速度,那么继续使用第二种方法,如果它可以让每个人的生活更轻松的话。但另一方面,如果有人抱怨过速度,或者如果表在未来可能会无限增长,或者您的用户数量可能会增加,请使用最有希望加快速度的方法


对评论的回应:不一定。假设产品模块添加了5个新列。要么您没有使用这些工具,因此没有加入或检索它们,并且无论选择哪种方法都不会受到影响,要么您需要它们,并且必须编写新代码来处理它们。无论如何,无论你选择哪种方法,你这边的变化都是一样的。假设产品模块重命名或删除了3列。然后,您的一方必须改变它处理返回值的方式,而与接口的编写方式无关。我明白你的意思了,但底线是,如果你使用变更中涉及的字段,你就必须进行代码变更。如果字段未被您使用,则不会。与使用select*from tbl查询相反,如果只获取所需的列,则不应存在您提到的涟漪影响。

在此处使用视图如何


不要调用get_product_info函数,而是让每个模块维护人员向该模块提供视图,例如product_info视图,然后将此视图用于查询。这样,您就不必担心此类视图的内部表,但仍将获得性能优势,因为datbase引擎将简化包含代码和视图的最终查询。

Martin Fowler在其惊人的著作《企业应用程序体系结构模式》中对持久性/数据源/ORM这类工作的正确方法进行了很好的描述。
这本书对于企业开发中的每个人来说都是必读的。

我明白了,但是如果产品模块决定修改其模式怎么办?由此产生的涟漪效应不会摧毁许多模块吗?另一方面,如果所有其他模块使用产品模块提供的接口访问产品,那么我希望不会出现任何问题!;-@ashkan.kh:我的回答太长了,所以我在上面的回答中加了它。观点似乎是正确的表达方式 这样做。但我很想知道这些东西是如何在专业产品中实现的。我想这个领域的专家应该已经对发展的基本方面进行了很好的调查。