我的一般问题是,我希望用户能够实际上添加任意数量的不同类型的字段以与项目关联。所以我正在考虑的一个解决方案如下:
table `items`
item_id | name
table `parameters`
parameter_id | name | type
table `values`
item_id | parameter_id | datetimevalue | datevalue | integervalue | etc...
如果用户想要为他的某些项目添加“出生日期”参数,我们会在参数表中添加一个参数,然后在值表中为他想要拥有此参数的每个项添加一个条目,日期在datevalue列中,所有其他'value'字段保留为null。
要按“出生日期”订购商品,假设此参数的参数为parameter_id = 1,我会这样做
SELECT * from
items
join values on items.item_id = values.item_id
join parameters on parameters.parameter_id = values.parameter_id
where parameter_id = 1
order by coalesce(values.datetimevalue, values.datevalue, values.integervalue...)
我的具体问题是,这个ORDER BY会有效吗?它会很好地利用指数吗?它会做不必要的工作吗?
我的一般问题是,这种方法是好的做法吗?有更好的方法吗?
答案 0 :(得分:1)
您正在谈论EAV建模。
答案 1 :(得分:0)
此ORDER BY COALESCE ...将无法使用索引。 COALESCE重要吗?看起来如果您正在查看单个参数,按列排序就足够了,因为所有值都属于同一类型。
如果您只是执行“ORDER BY datetimevalue,datevalue,integervalue”,则此查询将能够使用(parameter_id,datetimevalue,datevalue,integervalue)上的索引。
缺点:1)它看起来有点凌乱2)如果你有很多值列,如果你的值表会很大,那么索引就会浪费空间和读/写。
如果您只是在您的值表中添加“sort_order”(或其他内容)列并将其编入索引,那么您可能会更好。此外,如果您确实需要COALESCE,因为您想要对不同类型的值进行排序,您可以选择一个能做正确事情的sort_order计算。