我应该在laravel中使用EAV模型吗?

时间:2016-12-21 14:41:02

标签: php mysql laravel database-design entity-attribute-value

我正在构建一个应用程序,我在我的应用程序中有大约20个类别,每个类别都有一些自定义字段。因此,用户选择一个类别并填写自定义字段。之后我需要将值存储在DB中。你能说一下这样做的最佳方法吗?此外,我需要能够过滤此自定义字段 - 如高级过滤器和性能也是关键。

在这种情况下,我是否应该为每个类别创建一个单独的表及其自定义字段?

感谢您的帮助

达尼

2 个答案:

答案 0 :(得分:2)

在关系数据库中实现实体 - 属性 - 值(EAV)模型的好处和缺点与Laravel一样,与几乎所有其他框架或语言一样。我不认为使用Laravel确实与这个问题有任何关系。

如果您的用例需要EAV的灵活性,并且您已准备好额外的复杂性(按一个数量级)并为大的性能影响做好准备......如果那些不是破坏者,那么使用EAV模型

但如果你不需要EAV的任何好处,那么一定要避免这些缺点。

答案 1 :(得分:1)

我可以想到两种选择。

1)在类别表中创建一个名为属性的JSON字段。然后基本上存储一组键值。但是,在查询属性时会遇到一些挑战。我知道有很多方法,但我从来不需要它,所以我不知道。

2)在您的数据库中创建类似属性表,类似于此

cat_id - int
key - varchar
value - varchar
Composite Index Unique on [cat_id, key,value ]

然后在laravel中创建一个Category Attribute模型并定义一个hasmany关系,其中Category有许多Category Attributes

然后查询你的类别将会是这样的

$categories = Category::whereHas('CategoryAttributes', function ($query) { $query->where('key', '=', 'color'); $query->where('value','=', 'blue'); })->get();