sql >> Databáze >  >> RDS >> Mysql

Normalizace dat MySQL

Odpověď na všechny vaše otázky skutečně závisí na tom, k čemu data JSON slouží a zda budete někdy potřebovat použít nějakou vlastnost těchto dat k určení, které řádky se vrátí.

Pokud vaše data skutečně nemají žádné schéma a ve skutečnosti je používáte pouze k ukládání dat, která budou použita aplikací, která ví, jak pokaždé načíst správný řádek podle některých dalších kritérií (například podle jednoho z dalších polí), není důvod to ukládat jinak než přesně tak, jak to daná aplikace očekává (v tomto případě JSON).

Pokud data JSON obsahují nějakou strukturu, která je stejná pro všechny položky, a pokud je užitečné dotazovat se na tato data přímo z databáze, budete chtít vytvořit jednu nebo více tabulek (nebo možná jen několik dalších polí), kde budou tato data uložena. .

Praktickým příkladem je, že pokud datová pole obsahují výčtové služby JSON pro daného uživatele v poli a každá služba má jedinečné ID, typ a cenu, možná budete chtít samostatnou tabulku s následujícími poli (pomocí vlastního pojmenování konvence):

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

A každá služba pro tohoto uživatele dostane svůj vlastní záznam. Pak byste mohli hledat uživatele, než mít konkrétní službu, která v závislosti na vašich potřebách může být velmi užitečná. Kromě snadného dotazování může indexování určitých polí samostatných tabulek také zajistit velmi RYCHLÉ dotazy.

Aktualizace:Na základě vašeho vysvětlení uložených dat a způsobu, jakým je používáte, je pravděpodobně budete chtít normalizovat. Něco jako následující:

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

Potom se můžete zeptat takto:

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

Všimněte si, kolik toho můžete udělat s normalizovanými daty a jak snadné to je? Najít, aktualizovat, přidat nebo odstranit jakoukoli konkrétní komponentu je triviální.



  1. Jak mohu přidat nové sloupce do databáze SQLite po vydání aplikace pro Android?

  2. Získejte hodnoty za posledních 6 měsíců v mysql

  3. Zaznamenejte varování do tabulky

  4. JPA Criteria API:jak načíst datum ve formátu mm/dd/rrrr