【问题标题】:How do I write object classes effectively when dealing with table joins?在处理表连接时如何有效地编写对象类?
【发布时间】:2010-04-29 21:53:44
【问题描述】:

首先我应该说我现在不是,我也没有任何幻想我会成为一名专业程序员,所以我的大部分技能都是从经验中学到的,非常像一种爱好。

我学习了 PHP,因为它在某些领域似乎是一个很好的简单介绍,它使我能够设计简单的 Web 应用程序。

当我了解对象、类等时,导师的基本示例涵盖了这样一个想法,即根据经验,每个数据库表都应该有自己的类。虽然这对于我们编写的照片库项目很有效,因为它有非常简单的 mysql 查询,但现在我的项目变得越来越复杂,它的运行效果并不好。如果我需要来自两个需要表连接的单独表的数据,我会完全忽略该类并逐个处理它,或者,更糟糕的是,将一些数据合并到类中,其余的作为单独的实体并执行两个查询,这对我来说似乎效率低下。

例如,在查看我撰写的论坛上的内容时,如果您查看主题,我会从主题表、帖子表和用户表中检索数据。来自 user 和 posts 表的查询是通过连接检索的,而不是实例化为对象,而线程数据是使用我的 Threads 类调用的。

那么我如何才能从我目前的状况中得到一些不那么“愚蠢”的东西,因为我需要一个更好的词。现在我有一个处理连接和转义值等的数据库类,一个处理常见查询和方法的父数据库查询类,以及所有其他类(线程、上传、会话、照片和那些不是used Post, User 等)是它的子节点。

我是否要创建一个大型帖子类,其中包含我从用户(以及可能的线程)表中检索到的相关额外属性?
我是否有单独的类通过单个查询填充它们的每个相关属性?如果是这样,我该怎么做?
由于我的课程的编写方式,根据我所教的内容,我的数据库更新行方法或插入方法都只是将属性作为一个数组并更新所有这些,如果我在每个中都有其他数据库表的额外属性类,那么我该如何重写这些方法,因为那样会导致错误的自动更新?

简而言之,我认为我现在的理解是有限的,我想要一些关于如何编写更复杂类的基础知识的指导。

编辑:

感谢到目前为止的答案,他们给了我很多建议和想法以及很多阅读材料。不过,我想知道的是,不同的人如何决定处理带有任意数量类的简单表连接?您是否为类添加了属性?从类外查询然后将结果传递给每个类?还有什么?

【问题讨论】:

    标签: php oop class


    【解决方案1】:

    关于如何设计一组类以适应数据库模式的整本书都已写成。

    长话短说:没有一刀切的方法,您必须针对要在逐个应用程序的基础上做出的权衡做出大量设计决策。

    可以找一个库或者框架来帮忙,关键词:ActiveRecord、ORM(Object Relational Mapper)

    附:你不知道你可以进入的灵魂杀伤分析瘫痪和过度设计的潜力。为您的应用做最简单的事情。

    我的(以下)评论的代码示例:

    $post = new PublishedPost($data);
    $edit = $post->setTitle($newTitle);
    $edit->save();
    

    【讨论】:

    • 现在我想我正在寻找一个更好的想法,而不是“规范”是什么,而是不同的人认为可以接受的东西。例如,有一个 Post 类,它具有来自 users 表的 3 个属性是可以接受的吗?我很欣赏我可以通过多种方式编写课程,而正是这种多样性让我头疼。目前我一直在使用最简单的东西,不幸的是它不优雅,我一直在努力改进我写的东西。不过感谢关键字,这与其他答案一起为我提供了很多阅读材料。
    【解决方案2】:

    这太宽泛了,如果不进入史诗般的长度就无法回答。

    基本上,Patterns of Enterprise Architecture 有四种突出的数据源架构模式:Table Data GatewayRow Data GatewayActive RecordData Mapper。这些可以在常见的php frameworks 中以某些变体形式实现。这些很容易掌握和实施。

    当您开始处理数据库和应用程序中的业务对象之间的impedance mismatch 时,就会变得困难。为此,有许多对象关系行为、结构和元数据映射模式,如身份映射、延迟加载、查询对象、存储库等。解释这些超出了范围。它们涵盖了 PoEAA 中的近 200 页。

    您可以查看DoctrinePropel - 两个最知名的PHP ORM - 实现了这些模式中的大部分,您可以在应用程序中使用它们来替换当前的数据库访问处理。

    【讨论】:

    • 确实这是一个广泛的问题,但是在提出这个问题时,即使不是直接回答我的问题,我也有一些有用的指示。我已经开始欣赏这个网站上的人,他们给我指出了正确的方向,而不是告诉我该做什么,然后让我去学习。惊人的。当谈到你的答案时,虽然我觉得你现在指向我的很多东西都让我有点过头了,但是我已经收藏了很多项目,当我学习并希望进一步改进时它们将是我要重新审视的东西,所以谢谢。
    【解决方案3】:

    您可以通过检查在经过充分测试的框架中找到的现有解决方案来回答您的许多担忧,例如CakePHPsymfonyZend Framework。检查他们的方法并在引擎盖下偷看应该可以阐明您的问题。谁知道?您甚至可以决定使用它们编写未来的项目!

    他们花了数年时间齐心协力解决这些问题。好好利用!

    【讨论】:

    • 你肯定会走的! ;) 我一直在研究这些,我当然有兴趣研究我可以从使用框架中获得什么,但我没有考虑使用它们来回答我的问题,所以我会跟进。跨度>
    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 2015-10-17
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多