sql >> Database >  >> RDS >> Mysql

Waarden ophalen uit een genormaliseerde MySQL 5.7-structuur die aan bepaalde criteria voldoen

U hebt een tabel Entity-Attribute-Value gebruikt om uw attributen vast te leggen.

Dit is het tegenovergestelde van normalisatie.

Noem de regel van normalisatie die u heeft geleid om verschillende attributen in dezelfde kolom te plaatsen. Dat kan niet, omdat dit geen normalisatiepraktijk is.

Om uw zoekopdracht met uw huidige EAV-ontwerp uit te voeren, moet u het resultaat draaien zodat u iets krijgt alsof u uw originele tabel had.

SELECT * FROM (
    SELECT 
         a.article_id,
         a.title, 
         MAX(CASE attr_group WHEN 'ref_id' THEN attribute END) AS ref_id,
         MAX(CASE attr_group WHEN 'dial_c_id' THEN attribute END) AS dial_c_id
         -- ...others...
    FROM test.articles_test a
    INNER JOIN attributes attr ON a.article_id = attr.article_id
    GROUP BY a.article_id, a.title) AS pivot
WHERE pivot.ref_id = '127712' 
  AND pivot.dial_c_id = 51 

Hoewel de bovenstaande query het gewenste resultaat kan opleveren, zullen de prestaties verschrikkelijk zijn. Het moet een tijdelijke tabel maken voor de subquery, die alle gegevens uit beide tabellen bevat en pas vervolgens de WHERE-clausule toe op de tijdelijke tabel.

Je bent echt beter af met elk attribuut in zijn eigen kolom in je originele tabel.

Ik begrijp dat u in de toekomst veel attributen probeert toe te staan. Dit is een veelvoorkomend probleem.

Zie mijn antwoord opEen producttabel ontwerpen voor veel soorten producten waarbij elk product veel parameters heeft

Maar je moet het niet 'genormaliseerd' noemen, want dat is het niet. Het is niet eens gedenormaliseerd . Het is derelationeel .

Je kunt niet zomaar woorden gebruiken om alles te beschrijven wat je wilt - vooral niet het tegenovergestelde van wat het woord betekent. Ik kan de lucht niet uit mijn fietsband laten lopen en zeggen:"Ik pomp hem op."

U merkte op dat u probeert uw database "schaalbaar" te maken. Je begrijpt ook niet goed wat het woord "schaalbaar" betekent. Door EAV te gebruiken, creëert u een structuur waarin de benodigde query's moeilijk te schrijven en inefficiënt uit te voeren zijn, en de gegevens 10x ruimte innemen. Het is het tegenovergestelde van schaalbaar.

Wat je bedoelt is dat je een systeem probeert te maken dat uitbreidbaar is . Dit is complex om in SQL te implementeren, maar ik beschrijf verschillende oplossingen in het andere Stack Overflow-antwoord waarnaar ik heb gelinkt. Misschien vind je mijn presentatie Extensible Data Modeling with MySQL misschien ook leuk .




  1. Oracle SQL:het gedrag van SYS_GUID() begrijpen wanneer aanwezig in een inline-weergave?

  2. Time-outprobleem bij verbinding met basisgegevensbron (met mysql)

  3. Tel rijen in mysql-database waar tijdstempel binnen X-interval

  4. Hoe gebruik je Regexp in MySQL Vervang commando's?