在MySQl 5.7中,我曾经有一个带有4个表的EAV shema:
在陷入巨大的复杂性之后,我从another question获悉,这不是一个好方法。因此,我摆脱了表2所存储的所有属性,并按照STI模型的建议将它们与value或value_ids一起直接保存到表1中。
现在我得到了3张桌子:
起初看起来它使我的工作变得更轻松,但是当尝试替换一个简单的查询(该查询获取特定文章的所有属性组名称和属性名称)时,我发现这也不理想。
我之前的查询如下:
SELECT
cag.name_de,
cag.attr_group_id,
attr.attr_de,
attr.attr_id
FROM
articles_attr aa,
cat_attr attr,
cat_attr_groups cag
WHERE
aa.article_id = '181206'
AND aa.attr_id = attr.attr_id
AND cag.attr_group_id = attr.attr_group_id
现在有了新的架构,我至少需要这个:
获取所有组名,例如“颜色”
SELECT
name_de,
attr_group_id
FROM
cat_attr_groups
获取所有具有ID的间接值,例如“绿色”
SELECT
attr.attr_group_id,
attr.attr_de
FROM
articles a,
cat_attr attr
WHERE
a.article_id = '181206'
AND (
(a.dial_c_id = attr.attr_id)
OR (a.dial_n_id = attr.attr_id)
OR (a.bracelet_color_id = attr.attr_id)
)
// pseudo code
$attr[$row->attr_group_id] = $row->attr_de;
获取所有直接值:
SELECT
jewels,
vibrations
FROM
articles a
WHERE
a.article_id = '181206'
// pseudo code
$attr[4] = $row->jewels;
使用组ID映射组名称
foreach($attr AS $key => $value){
// somehow
}
这似乎不是很优雅。我该如何更好地设计Shema,或者如何重写这些查询以在可接受的查询时间内检索值?