2010-01-31 4 views
0

J'ai besoin d'attacher des attributs illimités à un enregistrement dans une table, et j'ai déjà conçu un système en utilisant # 3 ci-dessous en utilisant mysql. Malheureusement, je constate que la recherche sur un million d'enregistrements devient lente. La deuxième approche est-elle meilleure, ou existe-t-il une meilleure façon de procéder? Est-ce un cas d'utilisation d'une vue? J'aimerais que ma table de touches soit séparée afin que je sache quels attributs sont stockés pour chaque enregistrement.Quelle est la meilleure façon de concevoir des paires clé-valeur dynamiques dans mysql?

1: simple:

table records: id, recordname, valname 

select recordname from records where valname = 'myvalue' 

2: un peu plus complexe:

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: le plus complexe:

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' 
+0

Dites-vous que la requête sur 3 devient lente? – Hogan

+0

oui, il semble 3 devient lent. – invent

Répondre

2

Je voudrais que nous Les jointures internes. Cela donnera un jeu de résultats plus petit et celui que vous voulez.

Avez-vous essayé cette requête?

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' 

Cependant, je pense que la vraie façon de le faire est d'avoir 4 tables

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

ensuite (avec les index à droite) vous pouvez avoir une requête comme celui-ci

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' 

Cela devrait être assez rapide ... tout ce qu'il a à faire est de trouver l'identifiant dans les valeurs et les clés, puis faire un scan sur j. Si vous avez les bons index, ils seront rapides.

+0

Merci Hogan! c'est exactement le changement de paradigme que mon cerveau a dû faire ici! – invent

+0

Vous êtes les bienvenus, bonne chance (penser sql devient plus facile.) – Hogan

Questions connexes