0

我希望人们就以下问题对 Data Modeling Vs SQL (OOP Vs Select Statement) 的概念发表意见:在研究 MVC 和 OOP 概念时,很容易看到如下所示的自然形式:

<php? | <% | <#

Class Country{
     _name:String;
     _language:String;      
}

Class Estate{
     _name:String;
     _country:Country;
}

?> | % | #>

我想要得到的观点是一个简单的父子关系。现在,正如我在 ExtJS + PHP 和 JSF 2.0(使用 Converter 的 Java)上所看到的那样,很常见的是,DAO(数据访问对象)的定义如下所示:

Abstract class CountryDAO{
     public function getCountry();//This function returns an ArrayList.
     public function getCountryById(countryId:Integer);//This function returns a Country Object;
     ...
}

Class EstateDAO{
     public function getEstate(){
         $sql = "SELECT * FROM tbl_estate";
         //[your favorite way to comunicate with the database here]
         //Declare an ArrayList or something to store the result:
         $arrayList;
         while($result = $ResultSet.next()){
              $obj = new Estate();
              $obj->name = $result['name'];
              $obj->Country = new CountryDAO().getCountryById($result['country_id']);
              $arrayList->addItem($obj);
         }
     }
}

很抱歉混合了语言语法,我尽量不要太依赖语言,只是概念

现在完成我的想法:根据理论,这是正确的概念。就个人而言,我认为不同意它是不对的,因为这是事情的逻辑。但在实践中,现实世界永远不会像你想要的那样闪耀,我从中看到:

如果我有 10 个 Estates,我将在硬盘级别执行 11 个 SQL 语句(根据操作系统的理论,它是所有存储内存中最慢的)。

如果我有 100 个庄园,我将执行 101 条 SQL 语句。

如果我有n 个Estates,我将执行n+1 个SQL 语句。

我的最后一点:我认为,如果您要对可能有数千条记录的数据实体进行建模,那可能会很痛苦。由于这种思路,我在使用 Flex + PHP 时拒绝使用这种设计逻辑。但是现在我正在尝试构建一个将 Flex 和 ExtJS 作为查看器并使用 PHP 作为服务器端的应用程序,我只想确定我不会因为无关紧要的原因而选择最困难的路径。不尊重这种 MVC/OOP 逻辑是否更安全?我夸大其词了吗?您如何看待 OOP 上的 SQL 与数据模型?

谢谢。

4

2 回答 2

1

我建议远离直接映射到数据库表的 DAO 实现。相反,您应该研究数据映射器模式。

基本上,这个想法是,在模型层中,您将业务逻辑分离为域对象,将数据库交互分离为数据映射器。这样,当您需要获取项目集合(如 100 个庄园的详细信息)时,映射器仅执行 1 或 2 个查询,并将数据转储到处理集合的域对象中。

并且每个映射器都可以轻松处理多个数据库表。映射器的目标是获取域对象并将其与存储接口。没有法律规定您的域对象只能使用一张表。

无论如何,MVC 设计模式与您存储信息的位置无关。它只处理用户界面和域业务逻辑的分离。SQL 交互(如果您甚至使用 SQL 数据库而不是其他数据源)深埋在模型层中。

我强烈建议您阅读这篇文章:Martin FowlerGUI 架构

此外,如果您主要处理 PHP,您可能会发现此注释很有用。

于 2012-07-07T04:36:53.620 回答
0

你可以两全其美。您不需要以对象存储在内存中的方式存储对象,即使这样做,您也可以对其他对象进行建模,以便能够以有效的方式保存它们:给定:

Class Country{
     _name:String;
     _language:String;      
}
Class Estate{
     _name:String;
     _country:Country;
}

您可以创建:

Class EstateWithCountryInformation{
     _estateName:String;
     _countryName:String;
     _language:String;      
     getEstate();
     getCountry();
}

并且只有表 Country 和 EstateWithCountryInformation。这样您就可以在单个查询中获得所需的内容。如果您只需要查询 Estate 信息,您也可以从 EstateWithCountryInformation 表中获取它,或者您甚至可以创建一个 DataBase 视图来模拟该表。

我不知道你用什么来访问数据库,但我知道一些带有高级映射选项的 ORM,它允许你使用你最初定义的类,并自动映射到 EstateWithCountryInformation 之类的表,当你查询一个Estate,然后调用 new CountryDAO().getCountryById() 他们将信息缓存在内存中,因此它不会执行任何额外的数据库访问。

于 2012-07-07T04:15:28.490 回答