所需数据保存在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事件侦听器来处理Entity-Document关系。
第二种方式;
/**
* @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 - 教义2-哪种方法更合适?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20823307/