sql >> Databasteknik >  >> RDS >> Mysql

json-kolumn kontra flera kolumner

Kort svar, flera kolumner.

Långt svar:

För kärleken till allt som är heligt i världen, vänligen lagra inte flera datamängder i en enda textkolumn

Jag antar att du kommer att ha en tabell som antingen kommer att vara

+------------------------------+      +----------------------+
| User |  cell | office | home |  OR  | User | JSON String   |
+------------------------------+      +----------------------+

Först kommer jag att säga att båda dessa lösningar inte är den bästa lösningen men om du skulle välja bland de två är den första bäst. Det finns ett par anledningar, främst även om möjligheten att modifiera och fråga specifikt är väldigt viktig. Tänk på algoritmen för att ändra det andra alternativet.

SELECT `JSON` FROM `table` WHERE `User` = ?

Then you have to do a search and replace in either your server side or client side language

Finally you have to reinsert the JSON string

Denna lösning omfattar totalt 2 frågor och en sök- och ersätt-algoritm. Inte bra!

Tänk nu på den första lösningen.

SELECT * FROM `table` WHERE `User` = ?

Then you can do a simple JSON encode to send it down

To modify you only need one Query.

UPDATE `table` SET `cell` = ? WHERE `User` = ?

to update more than one its again a simple single query 

UPDATE `table` SET `cell` = ?, `home` = ? WHERE `User` = ?

Detta är klart bättre men det är inte bäst

Det finns en tredje lösning Säg att du vill att en användare ska kunna infoga ett oändligt antal telefonnummer.

Låt oss använda en relationstabell för det så nu har du två tabeller.

              +-------------------------------------+
+---------+   |      Phone                          | 
| Users   |   +-------------------------------------+ 
+---------+   | user_name| phone_number | type      |
| U_name  |   +-------------------------------------+
+---------+

Nu kan du fråga alla telefonnummer till en användare med något sånt här

Nu kan du fråga tabellen via en join

VÄLJ användare., telefon. FROM Phone, Users WHERE phone.user_name =? AND Users.U_name =?

Inlägg är lika enkelt och typkontroll är också lätt.

Kom ihåg att detta är ett enkelt exempel men SQL ger verkligen massor av kraft till din datastruktur, du bör använda den istället för att undvika den



  1. Mysql-tillägget är utfasat och kommer att tas bort i framtiden:använd mysqli eller PDO istället

  2. Få n grupperade kategorier och summera andra till en

  3. Returnera slutet av månaden i SQLite

  4. Tre främsta trender som påverkar DBA:er Ansvariga för SQL Server-övervakning