雄辩的ORM和EAV

qua*_*rei 3 orm entity-attribute-value eloquent

我将研究一个将使用EAV结构来存储对象数据的系统.模型本身将具有一些预定义的属性(坐标和日期/时间戳),即:

  • X
  • ÿ
  • ž
  • 开始日期/时间
  • 结束日期/时间

其余属性将由用户动态创建,并作为行添加到属性表中.这些行将被旋转并用作列以与值表对齐(不确定这是否需要解释,但更安全而不是抱歉).

属性关系的对象(或实体)是一对多的.

值与属性的属性是一对多关系.

我是Eloquent/Laravel的新手,但我已经阅读了关系文档并看到有一对多关系的功能,但是,我不清楚如何引用EAV中的所有数据(似乎更适合于RDBMS ).它会是这样的(请记住这是一个粗略的例子)?

class UserObject extends Eloquent {

    public function object_data()
    {
        return $this->hasMany(attributes_data);
    }

    public function attributes_data()
    {
        return $this->hasMany('Values');
    }

}
Run Code Online (Sandbox Code Playgroud)

基本上,我的问题是:

在检索与EAV相关的所有数据时,是否有一种可接受的(或正确的)方法来设计/编写模型?如果是这样,你能指出我的Eloquent/EAV方法的一些文档或教程吗?

一些想法:

我的想法是我需要为EAV的每个组件创建3个类(即一个用于实体组件数据,一个用于属性数据,一个用于值数据).

谢谢.

qua*_*rei 6

有几种方法可以解决这个问题(正如我通过其他论坛帖子发现的那样):

为每个EAV组件创建一个模型,例如伪代码:

class Object extends Eloquent{
    public function objects(){
        return $this->hasMany('Attribute');
    }
}

class Attribute extends Eloquent{
    public function attributes(){
        return $this->hasMany('Value');
    }
}

class Value extends Eloquent{
    public function values(){
        return /* etc. */;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将导致性能下降,因为将执行3个查询以检索值数据.

使用查询生成器

select() - > join() - > where("attribute","=","something")

这也会导致性能下降.

Laravel的数据库功能

基本上直接运行SQL查询可能会导致最少的开销,例如来自Laravel站点:

 $results = DB::select('select * from users where id = ?', array(1));
Run Code Online (Sandbox Code Playgroud)

边注:

对于这种系统(属性是动态的和未知的),最好完全避免使用EAV并坚持使用No-SQL解决方案,因为使用Laravel会更直观.我考虑过这个选项,并且会长期考虑这个.