sql >> Databasteknik >  >> RDS >> Mysql

Finns det någon fördel/nackdel med att lagra fältvärden som en JSON-array istället för att skapa nya tabeller och en-till-många-relationer?

Enligt min erfarenhet beror det ganska mycket på den data som lagras. Båda sätten har fördelar och nackdelar. Om det är en MMORPG webbspel och säg sedan att du har en PC som har ett bälte. Och PC:n kan lägga trolldrycker i bältet för snabb åtkomst under en strid. Så vi vill spara id:t för dryckerna, som lagras i karaktärens bälte.

Den vanligaste begäran skulle vara "skaffa alla drycker som karaktären X har". Och det skulle gå ganska fort i båda fallen.

Fördelarna med att lagra dessa potion-id som en separat tabell:

  • Du kan söka efter ett specifikt potion-id och det går väldigt snabbt. Exempel i spelet:administratörer har tagit bort en dryck från spelet och därför måste du uppdatera allas bälten
  • Du kan få bra statistik. Exempel i spelet:leta efter den mest använda drycken bland alla spelare
  • Databasen upprätthåller dataintegriteten. Exempel i spelet:du kommer aldrig att stöta på en situation när du använde drycken och spelet säger "Hoppsan, en dryck med det id finns inte"
  • Det är bra för konsistensen. Exempel i spelet:du tog en dryck från bältet och la den i ryggsäcken. Spelet kan implementera det genom att anropa en transaktion med två enkla tydliga SQL-satser.
  • Du kan göra JOINs. Exempel i spelet:vi måste få en lista över drycker i bältet tillsammans med deras namn, vikter och bilder som lagras i den separata tabellen.
  • Du kan uppdatera ett enda objekt utan att behöva uppdatera hela bältet. I-game-forced-exempel:du har en miljon drycker i bältet och du drack en.

Fördelarna med att lagra som en json:

  • Om det är ett webbläsarspel som använder javascript på klientsidan får du Belt json-objektet med en enkel begäran istället för att göra Select-query och sedan konvertera till json
  • Det är mycket lättare att upprätthålla ordning på objekt, eftersom json-arrayer redan är beställda. Med tabellmetoden skulle du behöva en extra kolumn som heter "beställning" och uppdatera den varje gång och kontrollera om två artiklar inte har samma beställning osv.
  • Du kan göra en massa omarrangemang i bältet på klientsidan, klicka sedan på "Apply" — boom, med en fråga kan du uppdatera hela bältet. Medan du med tabellmetoden skulle behöva minst två frågor för det (DELETE + INSERT)
  • Dessutom har populära DBMS plugins som stöder json-funktioner i databasen

Sammanfattning:de är inte stora fördelar och inte kritiska problem. Alla är lösbara och med en korrekt design av applikationen kommer båda lösningarna att fungera ok. Innan du bestämmer dig för hur du ska lagra data, fråga dig själv vilka är de vanligaste användningsfallen för dessa data och valde lösningen efteråt.



  1. Hur man får sista posten i varje grupp i MySQL

  2. Resultat av tidssubtraktionsformat

  3. $_POST-variabler fungerar inte med $_FILES och multipart/form-data

  4. Vad är SYSNAME-datatyp i SQL Server?