Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在mysql中设计动态键值对的最佳方法是什么?_Sql_Mysql_Join_Key - Fatal编程技术网

什么';在mysql中设计动态键值对的最佳方法是什么?

什么';在mysql中设计动态键值对的最佳方法是什么?,sql,mysql,join,key,Sql,Mysql,Join,Key,我需要将无限属性附加到表中的记录,并且我已经使用mysql设计了一个使用#3的系统。不幸的是,我发现搜索一百万条记录的速度越来越慢。#2是更好的方法,还是有更好的方法?这是使用视图的情况吗?我想把我的keys表分开,这样我就知道每个记录都存储了哪些属性 1:简单: table records: id, recordname, valname select recordname from records where valname = 'myvalue' table records: id r

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

1:简单:

table records: id, recordname, valname

select recordname from records where valname = 'myvalue'
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'
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'
2:稍微复杂一点:

table records: id, recordname, valname

select recordname from records where valname = 'myvalue'
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'
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:最复杂:

table records: id, recordname, valname

select recordname from records where valname = 'myvalue'
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'
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'

我会使用内部连接。这将得到一个较小的结果集和您想要的结果集

你试过这个查询吗

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上进行扫描。如果您有正确的索引,这些索引将很快完成。

我将使用内部联接。这将得到一个较小的结果集和您想要的结果集

你试过这个查询吗

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上进行扫描。如果您有正确的索引,这些索引将很快。

您是说3中的查询正在变慢吗?是的,似乎3正在变慢。您是说3中的查询正在变慢吗?是的,似乎3正在变慢。谢谢Hogan!这正是我的大脑在这里必须进行的范式转换!谢谢你,霍根!这正是我的大脑在这里必须进行的范式转换!