sql >> Database >  >> RDS >> Mysql

MySQL-gegevens normaliseren

Het antwoord op al uw vragen hangt echt af van waar de JSON-gegevens voor zijn en of u ooit een eigenschap van die gegevens moet gebruiken om te bepalen welke rijen worden geretourneerd.

Als uw gegevens echt geen schema hebben, en u gebruikt het eigenlijk alleen om gegevens op te slaan die worden gebruikt door een toepassing die elke keer weet hoe de juiste rij moet worden opgehaald op basis van een aantal andere criteria (zoals een van de andere velden), er is geen reden om het op te slaan als iets anders dan precies zoals die applicatie het verwacht (in dit geval JSON).

Als de JSON-gegevens WEL een structuur bevatten die voor alle items hetzelfde is, en als het handig is om deze gegevens rechtstreeks vanuit de database op te vragen, zou u een of meer tabellen (of misschien slechts enkele meer velden) willen maken om deze gegevens op te slaan .

Als een praktisch voorbeeld hiervan, als de gegevensvelden JSON-opsommingsservices voor die gebruiker in een array bevatten en elke service een unieke id, type en prijs heeft, wilt u misschien een aparte tabel met de volgende velden (met uw eigen naamgeving conventies):

serviceId (integer)
userName (string)
serviceType (string)
servicePrice (float)

En elke service voor die gebruiker zou zijn eigen invoer krijgen. U kunt dan naar gebruikers zoeken die een bepaalde service hebben, wat, afhankelijk van uw behoeften, erg handig kan zijn. Naast eenvoudige zoekopdrachten, kan het indexeren van bepaalde velden van de afzonderlijke tabellen ook zorgen voor zeer SNELLE zoekopdrachten.

Update:op basis van uw uitleg van de opgeslagen gegevens en de manier waarop u deze gebruikt, wilt u waarschijnlijk dat deze worden genormaliseerd. Iets als het volgende:

# user table
userId (integer, auto-incrementing)
userName (string)
userEmail (string)
password (string)
deviceID (string)

# note table
noteId (integer, auto-incrementing)
userId (integer, matches user.userId)
noteTime (datetime)
noteData (string, possibly split into separate fields depending on content, such as subject, etC)

# request table
requestId (integer, auto-incrementing)
userId (integer, matches user.userId)
requestTime (datetime)
requestData (string, again split as needed)

Je zou dan zo kunnen vragen:

# Get a user
SELECT * FROM user WHERE userId = '123';
SELECT * FROM user WHERE userNAme = 'foo';

# Get all requests for a user
SELECT * FROM request WHERE userId = '123';
# Get a single request
SELECT * FROM request WHERE requestId = '325325';

# Get all notes for a user
SELECT * FROM note WHERE userId = '123';
# Get all notes from last week
SELECT * FROM note WHERE userId = '123' AND noteTime > CURDATE() - INTERVAL 1 WEEK;

# Add a note to user 123
INSERT INTO note (noteId, userId, noteData) VALUES (null, 123, 'This is a note');

Merk op hoeveel meer u kunt doen met genormaliseerde gegevens en hoe gemakkelijk het is? Het is triviaal om een ​​specifiek onderdeel te vinden, bij te werken, toe te voegen of te verwijderen.



  1. PHP MYSQL kon geen verbinding maken (HY000/2002)

  2. Een procedure uitvoeren binnen een pakket in Oracle

  3. Selecteer gebruikers die alleen tot bepaalde afdelingen behoren

  4. Metaprogrammering Oracle SQL Select-instructie