Sql web应用OO概念混乱

Sql web应用OO概念混乱,sql,ajax,oop,web-applications,Sql,Ajax,Oop,Web Applications,这是一个关于“最佳做法”和“有效利用”资源的概念问题。 专门处理数据库和在线web应用程序中的大型数据集,并从过程处理方法转向更面向对象的方法 以“列表”页面为例,几乎可以在应用程序的所有CRUD方面找到它。该列表显示公司、地址和联系人。为了论证和“适当的”RDBM,假设我们已经规范化了数据,这样一个公司可以有多个地址和联系人。 -对于我们的场景,假设我有一个200家公司的列表,每个公司有2-10个地址,每个地址都有一个联系人。i、 e.“商店”名称为“麦当劳”的任何特许经营权,但该“名称”可能

这是一个关于“最佳做法”和“有效利用”资源的概念问题。 专门处理数据库和在线web应用程序中的大型数据集,并从过程处理方法转向更面向对象的方法

以“列表”页面为例,几乎可以在应用程序的所有CRUD方面找到它。该列表显示公司、地址和联系人。为了论证和“适当的”RDBM,假设我们已经规范化了数据,这样一个公司可以有多个地址和联系人。 -对于我们的场景,假设我有一个200家公司的列表,每个公司有2-10个地址,每个地址都有一个联系人。i、 e.“商店”名称为“麦当劳”的任何特许经营权,但该“名称”可能有多个地址)

桌子

  • 公司
  • 地址
  • 接触
在这一点上,我将进行一个DB调用,并使用连接来提取所有数据,循环数据并输出每一行。。。在应用层进行一些分组,以友好的方式显示内容。(这似乎是最有效的方法,因为RDBM完成了繁重的工作——网络调用最少(一个到db,一个来自db,一个http请求,一个http响应)

如果无法在应用程序层分组,另一种方法是查询公司列表,在该列表上循环,然后在循环内为地址contact单独进行DB调用。效率较低,因为您要进行多个DB调用

现在-问题,或症结点…概念上

如果我有一个company对象、address对象和contact对象——似乎为了获得相同的结果——你会调用一个“getcompanys”方法来返回一个列表,你会在列表上循环,并为每个对象调用“getAdders”,同样地,还会调用一个“getContact”——传递公司ID等等

在web应用程序中——这意味着从应用程序层到数据库的数据流量要大得多,以及许多较小的数据库调用,等等——这似乎严重降低了效率

如果将相当多的逻辑转移到客户端,对于AJAX应用程序,除了增加的内部网络开销外,还会产生网络流量

有人能评论一下最好的方法吗?也许这是一个概念性的问题


有人建议,“网关”是指当你访问这些大型数据集时,而不是访问更小、更细粒度的对象数据-但这并不能真正帮助我理解,我也不确定它是否准确。

当然,从数据库一次获取所需的一切是最有效的。你不需要因为你ant将您的代码编写为OO模型。基本上,您首先从数据库获得所有结果,然后将表格数据转换为分层形式,以填充对象。“getCompanies”可以进行单个数据库调用,将地址和联系人连接在一起,并返回包含填充的“地址”和“联系人”列表的“公司”对象。请参阅。

我已经多次处理过这个问题。要记住的第一件也是最重要的一件事是:不要过早地进行优化。优化代码的可读性、枯燥原则等,然后回来修复“缓慢”的问题

但是,对于这种情况,与其一次迭代获取每个公司的地址,不如将所有公司ID的列表传递给获取程序,获取所有这些公司ID的所有地址,然后将该地址列表缓存在映射中。当需要按addressID获取地址时,请从该本地缓存中获取它。这是调用IdentityMap。但是,正如我所说的,我不建议在需要之前为此优化重新编码流。通常情况下,页面上有10项内容,而不是100项,因此通过更改优化流的“正常”流,您只需节省几毫秒


当然,一旦你这样做了20次,在“优化流”中编写代码就变得更自然了,但是你也有这样的经验:什么时候做,什么时候不做。

是的,我可以让一个对象返回所有连接的数据,而这不会破坏“对象”-但是(概念上),返回所有与“公司”相关的数据这意味着根据我的编程操作,我返回了很多可能没有用的数据。例如,自动完成查询实际上应该只重新运行公司名称和ID,没有“需要”地址字段和联系人字段,就连接而言。因此“getCompany()”-返回全部VS.getCompany(ID).r u说两个不同的“get”,比如getCompanyDetails,或者getCompanyList?一个针对每个集合的方法??似乎有很多特殊的对象或方法,需要过多的参数。只是好奇这是否是常见的-以及每个应用程序中都需要定义和决定的东西…@jpmyob是的,系统应该是灵活的但是,对于每种类型的联接,您不需要使用不同类型的对象,因为如果地址表没有联接,“company”对象的“getAddresses()”方法,那么它就不会返回任何内容(或者它可以在第一次调用时查询数据库,然后使用缓存的结果——这称为延迟加载)。@jpmyob有一个好的对象关系映射器,通常不需要定义诸如“getCompanies”、“getCompaniesWithAddresses”等专用函数。例如,使用SQLAlchemy(Python的ORM)例如,您可以使用以下代码获取公司及其地址(但不包括联系人):
session.query(Company).join(Address)
库中已经定义了
query
join
函数,您只需要定义
公司
地址
类。