我真的迷失了这个案子。我正在尝试将自定义MVC框架应用于我的Web应用程序。组织SQL查询会引起混乱。好的,情况就是这样:
UserRepository
,ThreadRepository
和PostRepository
都是包含与其相关的SQL查询的存储库。例如,在ThreadRepository
我有getThread
函数,它通过其ID从数据库中检索线程,在UserRepository
我有getUser
函数等等......
但是,请说我在页面中我必须检索帖子,帖子和提交者。当我应用上述逻辑时,我必须明确地致电getUser
,getThread
和getPost
。如果我没有使用MVC,那么我可能会创建一个这样的SQL查询:
SELECT * FROM user
LEFT JOIN thread on userid = tuserid /* Thread user id = user id */
LEFT JOIN post on pthreadid = threadid /* Post thread id = thread id */
瞧,我会在一个查询中检索所有必需的东西。但在这种情况下,即使我写了这样一个SQL,我应该在哪个存储库中放置它?我的意思是,很难看到如下代码:
$pr = new PostRepository();
$user = $pr->getPostAlongItsThreadAndItsSubmitter($postid);
来吧,看看这个,首先代码不清楚。您必须查看PostRepository以发现从那里检索用户,这实际上不太可能是您作为第三人看的第一个地方。其次,它不具备可扩展性。将来,随着应用程序的增长,我将不得不在检索用户统计信息,用户朋友或用户消息时应用相同的逻辑。然后它将变得复杂。
另一方面,如果我调用上面提到的函数(例如getUser
)来分别检索一个帖子,它的线程和提交者,那么这意味着我将不得不从表现中牺牲很多我正在制作(至少)三个不同的mysql查询来检索一些可以通过简单连接成功管理的基本内容。 (这里我假设3个查询比简单连接慢,这就是我在搜索时读到的内容)
所以最后,我真正要问的是如何组织业务逻辑,以便我可以轻松检索帖子,它所属的线程及其提交者(实际上,这可能很难满足选项)以下)过程是:
所有评论和意见都非常感谢。
PS:我知道这不是这是什么或为什么会出现这个问题,但是请在这个案例中真的需要帮助所以不要点击关闭只是因为这不是一个可以用句子回答的问题。如有必要,请让我改进问题。
答案 0 :(得分:1)
首先,这看起来您的数据库抽象不会抽象连接表:您在数据库抽象中缺少一个与示例SQL SELECT ... JOIN
查询等效的实现。
所以我认为这是你的基本问题。
当你使用数据库抽象时,你可以抱怨每个抽象层都带有一个价格(三个数据库查询而不是一个)或者在这里学到一个教训:每个抽象都带有价格。
不,设计中没有银弹。
因此,如果您可以通过培训新开发人员来解决您的问题(例如,您实际上已经为您编写的软件制定了规范,对吗?)它有什么不好的?这将完成这项工作。
最后,您将在某处执行JOIN SQL查询。不过你的名字。该函数将返回从数据存储中查询的三个对象。但是你转过它。
抽象的好处是,在你的业务逻辑中,你不需要处理数据存储,但你只需使用你的(也许你找到一个更好的名称)函数:
$pr = new PostRepository();
$user = $pr->getPostAlongItsThreadAndItsSubmitter($postid);
但我想知道为什么你使用PostRepository
来返回$user
,也许这只是因为你无法真正下定决心。
无论如何,你的数据存储抽象似乎是多余的,因为所有类都相似,只是因为它们的类型而不同。也许你只有一个DataRepository
和一个DataQuery
对象,哪些方法可以返回单个对象(Recordset like Pattern)或这些对象的列表。