Doctrine2 - 哪种方法更合适?

时间:2013-12-29 08:10:38

标签: mysql sql mongodb doctrine-orm database

所需数据保存在mysql中。但是,可以为空的数据保存在mongodb中。此外,MongoDB将快速读取数据。以这种方式分配负载。所以,我正在使用两个数据库。

第一种方式;

Mysql 数据库架构;

的settings.php;

/**
 * @ORM\Entity
 * @ORM\Table(name="settings")
 */
class Settings
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="integer")
     */
    protected $userid;

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="settings")
     * @ORM\JoinColumn(name="userid", referencedColumnName="id")
     */
    protected $user;

Mongodb 数据库架构;

/**
 * @MongoDB\Document(collection="settingsData")
 */
class SettingsData
{
    /**
     * @MongoDB\Id
     */
    protected $id;

    /**
     * @MongoDB\Field(type="int")
     */
    protected $settingsid;

    /**
     * @MongoDB\Field(type="hash")
     */
    protected $data;

}

通过这种方法,我可以建立一个关系数据库。但是,我需要打开一个额外的表(mysql - >设置表)。我正在使用Doctrine2事件监听器来实现实体 - 文档关系。

第二种方式;

/**
 * @MongoDB\Document(collection="settings")
 */
class Settings
{
    /**
     * @MongoDB\Id
     */
    protected $id;

    /**
     * @MongoDB\Field(type="int")
     */
    protected $userid;

    /**
     * @MongoDB\Field(type="hash")
     */
    protected $data;
}

在这种方法中,我可以直接添加数据。无需额外的表来检索数据。我只需要编写额外的代码。但这种关系破裂了。代码将很难遵循。 (我在大多数系统中使用了第一种方法。但它们只是MySQL。)

问题;哪种方法可以提高性能,适当

1 个答案:

答案 0 :(得分:0)

如果您同时使用Doctrine ORM和MongoDB ODM,则可以使用this extension映射MySQL实体和MongoDB文档之间的引用。它显然不会提供任何类型的引用完整性,但它允许您通过应用程序中的getter方法和Proxy对象非常轻松地导航关系(例如,无需收集整数ID并发出SQL查询)。

根据您的架构,您似乎只将MongoDB用于$data属性,该属性被映射为散列类型(MongoDB对象)。您实际上并没有使用嵌入式文档为此属性定义架构,因此我假设您实际上并未查询此字段,而是仅存储任意键/值数据。如果是这种情况,将键/值数据存储为序列化或JSON字符串会不会更简单?为了这个目的,Doctrine ORM甚至有json_array type mapping