【问题标题】:what's the best way to design dynamic key-value pairs in mysql?在mysql中设计动态键值对的最佳方法是什么?
【发布时间】:2010-01-31 07:41:38
【问题描述】:

我需要将无限属性附加到表中的记录,并且我已经使用下面的#3 使用 mysql 设计了一个系统。不幸的是,我发现搜索一百万条记录变得越来越慢。 #2 是更好的方法,还是有更好的方法?这是使用视图的情况吗?我想让我的键表分开,这样我就知道为每条记录存储了哪些属性。

1:简单:

table records: id, recordname, valname

select recordname from records where valname = 'myvalue'

2:稍微复杂一点:

table records: id recordname
table keyvalues: id recordid keyname valname

    select r.recordname 
    from records r
    right join keyvalues kv on kv.recordid = r.id 
       and kv.keyname='mykey' 
       and kv.valname = 'myvalue'

3:最复杂:

table records: id recordname
table keys: id keyname
table values: id recordid keyid valname   

 select r.recordname 
    from records r
    right join keys k on k.keyname='mykey'
    right join values v on v.recordid = r.id 
       and v.keyid = k.id 
       and v.valname = 'myvalue'

【问题讨论】:

  • 你是说 3 中的查询变慢了吗?
  • 是的,好像 3 变慢了。

标签: sql mysql join key


【解决方案1】:

我会使用内部连接。这将提供更小的结果集和您想要的结果集。

你试过这个查询吗?

select r.recordname
from records r
left join values link on link.recordid = r.id and link.valname = 'myvalue'
left join keys k on r.keyid = link.key.id and k.keyname = 'mykey'

但是,我认为真正的方法是拥有 4 张桌子

table records: id recordname
table keys: id keyname
table values : id valuename
table joins : id recordid keyid valueid

然后(使用正确的索引)您可以进行这样的查询

select r.recordname
from joins j
left join records r on j.recordid = r.id
left join keys k on j.keyid = k.id
left join values v on j.valueid = v.id
where v.valuename = 'myvalue' and k.keyname = 'mykey'

这应该很快......它所要做的就是在值和键中找到id,然后对j进行扫描。如果你有正确的索引,这些会很快。

【讨论】:

  • 谢谢霍根!这正是我的大脑必须在这里做出的范式转变!
猜你喜欢
  • 2018-05-01
  • 1970-01-01
  • 2017-02-22
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2013-03-26
  • 2010-11-11
相关资源
最近更新 更多