我应该在 laravel 中使用 EAV 模型吗?
Should I use a EAV model or not in laravel?
我正在构建一个应用程序,我的应用程序中有大约 20 个类别,每个类别都有一些自定义字段。因此,用户选择一个类别并填写自定义字段。之后我需要将值存储在数据库中。你能建议什么是最好的方法吗?我还需要能够过滤此自定义字段 - 就像高级过滤器一样,性能也是一个关键。
在这种情况下,我是否应该为每个类别创建一个单独的 table 及其自定义字段?
感谢您的帮助
丹妮
我能想到的有两个方案。
1) 在您的类别 table 中创建一个名为类似属性的 JSON 字段。然后基本上在其中存储一组键值。不过,这在查询属性时会带来一些挑战。我知道有解决办法,但我从来不需要它,所以我不知道。
2) 在您的数据库中创建一个类别属性 table,如下所示
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();
在关系数据库中实现实体-属性-值 (EAV) 模型的优点和缺点与 Laravel 几乎所有其他框架或语言一样。我不认为使用 Laravel 真的与问题有任何关系。
如果您的用例需要 EAV 的灵活性,并且您已准备好应对额外的复杂性(一个数量级)并准备好应对性能大幅下降...如果这些都不是破坏者,那么请使用EAV模型。
但是如果您不需要 EAV 的任何好处,那么一定要避免缺点。
我正在构建一个应用程序,我的应用程序中有大约 20 个类别,每个类别都有一些自定义字段。因此,用户选择一个类别并填写自定义字段。之后我需要将值存储在数据库中。你能建议什么是最好的方法吗?我还需要能够过滤此自定义字段 - 就像高级过滤器一样,性能也是一个关键。
在这种情况下,我是否应该为每个类别创建一个单独的 table 及其自定义字段?
感谢您的帮助
丹妮
我能想到的有两个方案。
1) 在您的类别 table 中创建一个名为类似属性的 JSON 字段。然后基本上在其中存储一组键值。不过,这在查询属性时会带来一些挑战。我知道有解决办法,但我从来不需要它,所以我不知道。
2) 在您的数据库中创建一个类别属性 table,如下所示
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();
在关系数据库中实现实体-属性-值 (EAV) 模型的优点和缺点与 Laravel 几乎所有其他框架或语言一样。我不认为使用 Laravel 真的与问题有任何关系。
如果您的用例需要 EAV 的灵活性,并且您已准备好应对额外的复杂性(一个数量级)并准备好应对性能大幅下降...如果这些都不是破坏者,那么请使用EAV模型。
但是如果您不需要 EAV 的任何好处,那么一定要避免缺点。