我应该在 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 的任何好处,那么一定要避免缺点。