标准化数据库中产品特征的雄辩关系?

Jac*_*son 5 laravel eloquent

我已经浏览了几十个 Eloquent 问题,但是这些例子通常很容易掌握。例如,一个用户有一个电话或一个类别有很多帖子。

我正在尝试存储产品功能并在它们之间建立关系,同时保持数据库尽可能接近规范化,否则很容易将每个组合及其数据存储在一行中。

考虑一个产品,它可以具有许多特征(材料、尺寸、重量、颜色等)。分配给产品的每个特征只能有一个值,例如,材料是木材。

为了避免重复条目,我将功能和值保存在单独的表中。因为例如 Wood 可以被 Material 和 Texture 使用。

这是我的数据库结构:

feature
  - id
  - name ( E.g. Material )

feature_value
  - id
  - value ( E.g. Wood, must be unique )

feature_value_combination
  - id
  - id_feature
  - id_value

product_feature
  - id
  - id_product
  - id_combination
Run Code Online (Sandbox Code Playgroud)

这样我也可以将它们分组并防止重复。但是我很难理解这些之间的关系,因为很多关系都可以工作。我的问题是:

  • 我需要多少 Eloquent?组合需要自己的 Eloquent 吗?
  • 这里有什么关系?因为有道理,afeature value属于一个组合,也有一个组合,同时属于一个特征名称和一个产品,而且一个产品也可以有一个特征,一个值,一个组合。这里的一切似乎都混乱了。

对澄清这一点的任何帮助表示赞赏。

更新

我设法设置了基本关系,但代价是创建 5 个模型,即使是数据透视表也是如此。

楷模:

  • M1) 产品
  • M2) 特征名称
  • M3) 特征值
  • M4) 功能名称值
  • M5) ProductFeatureNameValueRelation

现在我可以使用以下方法获取产品及其功能数据:

Product
    ::where( 'id', $id )
    ->with( 'getM5data.getM4data.getM3data')
    ->get();
Run Code Online (Sandbox Code Playgroud)

我使用了短名称以使其更易于阅读。这些方法中的每一个都使用关系获取所需的数据。然而,这会导致 5 个查询,这是令人憎恶的:

select * from `products` where `id` = 1 
select * from `product_feature_relations` where `product_feature_relations`.`id_product` in (1)  
select * from `product_feature_name_value` where `product_feature_name_value`.`id` in (2, 3)  
select * from `product_feature_values` where `product_feature_values`.`id` in (4, 5)  
select * from `product_feature_names` where `product_feature_names`.`id` in (6, 7)  
Run Code Online (Sandbox Code Playgroud)

这可以使用内部联接和 2 个查询轻松完成。我不知道如何将上面的转换为这个。