Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于在使用基于SQL的数据库时是否尊重OOP/MVC数据模型设计的讨论_Sql_Model View Controller_Oop_Model_Dao - Fatal编程技术网

关于在使用基于SQL的数据库时是否尊重OOP/MVC数据模型设计的讨论

关于在使用基于SQL的数据库时是否尊重OOP/MVC数据模型设计的讨论,sql,model-view-controller,oop,model,dao,Sql,Model View Controller,Oop,Model,Dao,我想听听人们对数据建模与SQL(OOP与Select语句)的概念在以下方面的看法: 在研究MVC和OOP概念时,很容易看到以下内容的自然形式: <php? | <% | <# Class Country{ _name:String; _language:String; } Class Estate{ _name:String; _country:Country; } ?> | % | #> 很抱歉混合了语言

我想听听人们对数据建模与SQL(OOP与Select语句)的概念在以下方面的看法: 在研究MVC和OOP概念时,很容易看到以下内容的自然形式:

<php? | <% | <#

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

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

?> | % | #>
很抱歉混合了语言语法,我不想太依附于语言,只是概念

现在让我来总结一下我的想法:根据理论,这是正确的概念。就我个人而言,我认为不同意这一点是不对的,因为这是事情的逻辑。但在实践中,现实世界永远不会如你所愿闪耀,我从中看到:

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

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

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

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


谢谢。

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

您可以创建:

Class EstateWithCountryInformation{
     _estateName:String;
     _countryName:String;
     _language:String;      
     getEstate();
     getCountry();
}
并且只有Country和EstateWithCountryInformation表。这样,您就可以在一个查询中获得所需的内容。如果您需要只查询房地产信息,也可以从EstateWithCountryInformation表中获取,或者您甚至可以创建一个数据库视图来模拟该表


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

我建议不要使用直接映射到数据库表的DAO实现。相反,您应该研究模式

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

每个映射器可以轻松地处理一个DB表中的多个映射。mapper的目标是获取域对象并将其与存储接口。没有法律规定域对象只能使用一个表

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

我强烈建议你阅读这篇文章:由马丁·福勒撰写


另外,如果您主要使用PHP,您可能会发现它很有用。

谢谢,这很有帮助。现在我想我知道为什么我应该考虑学习如何使用Orm Orm。
Class Country{
     _name:String;
     _language:String;      
}
Class Estate{
     _name:String;
     _country:Country;
}
Class EstateWithCountryInformation{
     _estateName:String;
     _countryName:String;
     _language:String;      
     getEstate();
     getCountry();
}