mysql - Doctrine2 - 哪种方法更合适?

标签 mysql sql mongodb doctrine-orm database

所需数据保存在mysql中。但是,可为空的数据保存在 mongodb 中。此外,MongoDB 读取数据的速度很快。这样负载就被分配了。所以,我使用两个数据库。

第一种方式;

Mysql数据库架构;

设置.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。)

问题;哪种方法性能更好并且合适

最佳答案

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

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

关于mysql - Doctrine2 - 哪种方法更合适?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20823307/

相关文章:

mongodb - 如何将具有自定义 MarshalBSONValue 的结构的 nil 指针序列化为 BSON?

php - 使用 php 服务器聊天 android 的可行性?

sql - PostgreSQL drop table 命令没有减少数据库大小

mysql - 根据两列中具有特定值的多个条件排除记录

mysql - SQLSTATE[23000] : Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails

node.js - ACL 最佳实践,在用户对象中存储角色,还是单独的表/集合?

jquery - 使用 mysql 和 nodejs 更新查询时出现 ER_PARSE_ERROR

mysql - SQL 仅选择列上具有最大值的行

java - 如何将ArrayList数据存储到mysql的单个字段中?

javascript - 通过子子文档 id mongoose 检索子子文档