Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Normalisieren von MySQL-Daten

Die Antwort auf alle Ihre Fragen hängt wirklich davon ab, wofür die JSON-Daten bestimmt sind und ob Sie jemals eine Eigenschaft dieser Daten verwenden müssen, um zu bestimmen, welche Zeilen zurückgegeben werden.

Wenn Ihre Daten wirklich kein Schema haben und Sie sie wirklich nur zum Speichern von Daten verwenden, die von einer Anwendung verwendet werden, die weiß, wie sie jedes Mal die richtige Zeile nach anderen Kriterien (z. B. einem der anderen Felder) abruft, Es gibt keinen Grund, es anders als genau so zu speichern, wie es die Anwendung erwartet (in diesem Fall JSON).

Wenn die JSON-Daten eine Struktur enthalten, die für alle Einträge gleich ist, und wenn es sinnvoll ist, diese Daten direkt aus der Datenbank abzufragen, sollten Sie eine oder mehrere Tabellen (oder vielleicht nur einige weitere Felder) erstellen, um diese Daten zu speichern .

Wenn die Datenfelder als praktisches Beispiel JSON-Aufzählungsdienste für diesen Benutzer in einem Array enthalten und jeder Dienst eine eindeutige ID, einen eindeutigen Typ und einen eindeutigen Preis hat, möchten Sie möglicherweise eine separate Tabelle mit den folgenden Feldern (unter Verwendung Ihrer eigenen Benennung Konventionen):

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

Und jeder Dienst für diesen Benutzer würde seinen eigenen Eintrag erhalten. Sie könnten dann nach Benutzern suchen, die einen bestimmten Dienst haben, was je nach Ihren Anforderungen sehr nützlich sein könnte. Neben der einfachen Abfrage kann die Indizierung bestimmter Felder der einzelnen Tabellen auch sehr SCHNELLE Abfragen ermöglichen.

Update:Basierend auf Ihrer Erklärung der gespeicherten Daten und der Art und Weise, wie Sie sie verwenden, möchten Sie wahrscheinlich, dass sie normalisiert werden. Etwas wie das Folgende:

# 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)

Sie könnten dann so abfragen:

# 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');

Beachten Sie, wie viel mehr Sie mit normalisierten Daten tun können und wie einfach es ist? Es ist einfach, eine bestimmte Komponente zu finden, zu aktualisieren, anzuhängen oder zu löschen.