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

问题描述 投票:0回答:3

我正在构建一个应用程序,我的应用程序中有大约 20 个类别,每个类别都有一些自定义字段。因此,用户选择一个类别并填写自定义字段。之后我需要将值存储在数据库中。你能建议什么是最好的方法吗?我还需要能够过滤这个自定义字段——就像高级过滤器一样,性能也是一个关键。

在这种情况下,我是否应该为每个类别制作一个单独的表格,其中包含他们的自定义字段?

谢谢你的帮助

丹妮

php mysql laravel database-design entity-attribute-value
3个回答
2
投票

我能想到的有两种选择。

1) 在您的类别表中创建一个名为 attributes 的 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();


2
投票

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

如果您的用例需要 EAV 的灵活性,并且您已准备好应对额外的复杂性(一个数量级)并准备好迎接巨大的性能冲击......如果这些都不是破坏者,那么请使用 EAV 模型。

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


0
投票

这里有一个很好的比较,这是他的结论:

  • 哪里有 EAV 方法比其他结构慢 3-4 倍
  • JSON 方法只比常规列的方法慢 10-30%

不确定您是否会从我的基准测试中得出相同的结论,或者可能会优化某些查询。

总而言之,我的建议是避免使用 EAV 模型,除非你真的需要它。 JSON 列在性能方面还可以,但取决于您的(更复杂?)结构也可能更慢或更不方便查询。

向同一个表添加更多字段的好旧方法可能听起来并不“性感”,但如果您追求简单性和“现在”最快的性能,您应该考虑从该结构开始。

© www.soinside.com 2019 - 2024. All rights reserved.