Каков наилучший способ создания динамических пар ключ-значение в MySQL? - PullRequest
0 голосов
/ 31 января 2010

Мне нужно прикрепить неограниченное количество атрибутов к записи в таблице, и я уже спроектировал систему, используя # 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'

1 Ответ

2 голосов
/ 31 января 2010

Я бы использовал внутренние соединения. Это даст меньший набор результатов и тот, который вы хотите.

Вы пробовали этот запрос?

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'

Это должно быть довольно быстро ... все, что нужно сделать, это найти идентификатор в значениях и ключах, а затем выполнить сканирование на j. Если у вас есть правильные индексы, они будут быстрыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...