Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menormalkan data MySQL

Jawaban atas semua pertanyaan Anda sangat bergantung pada untuk apa data JSON, dan apakah Anda perlu menggunakan beberapa properti dari data tersebut untuk menentukan baris mana yang dikembalikan.

Jika data Anda benar-benar tidak memiliki skema, dan Anda benar-benar hanya menggunakannya untuk menyimpan data yang akan digunakan oleh aplikasi yang tahu cara mengambil baris yang benar dengan beberapa kriteria lain (seperti salah satu bidang lain) setiap saat, tidak ada alasan untuk menyimpannya sebagai apa pun selain persis seperti yang diharapkan aplikasi itu (dalam hal ini, JSON).

Jika data JSON TIDAK berisi beberapa struktur yang sama untuk semua entri, dan jika berguna untuk menanyakan data ini langsung dari database, Anda ingin membuat satu atau lebih tabel (atau mungkin hanya beberapa bidang lagi) untuk menyimpan data ini .

Sebagai contoh praktisnya, jika bidang data berisi layanan enumerasi JSON untuk pengguna tersebut dalam larik, dan setiap layanan memiliki id, jenis, dan harga yang unik, Anda mungkin menginginkan tabel terpisah dengan bidang berikut (menggunakan penamaan Anda sendiri konvensi):

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

Dan setiap layanan untuk pengguna itu akan mendapatkan entrinya sendiri. Anda kemudian dapat meminta pengguna daripada memiliki layanan tertentu, yang tergantung pada kebutuhan Anda, bisa sangat berguna. Selain kueri yang mudah, pengindeksan bidang tertentu dari tabel terpisah juga dapat menghasilkan kueri yang sangat CEPAT.

Pembaruan:Berdasarkan penjelasan Anda tentang data yang disimpan, dan cara Anda menggunakannya, Anda mungkin menginginkannya dinormalisasi. Sesuatu seperti berikut:

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

Anda kemudian dapat menanyakan seperti ini:

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

Perhatikan berapa banyak lagi yang dapat Anda lakukan dengan data yang dinormalisasi, dan betapa mudahnya? Mencari, memperbarui, menambahkan, atau menghapus komponen tertentu itu sepele.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gabung bersyarat SQL server

  2. MySQL InnoDB hanya mengunci baris yang terpengaruh?

  3. mengimplementasikan kueri LIKE di PDO

  4. MYSQL QUERY ganti nilai NULL berturut-turut dengan nilai rata-rata

  5. Python 'int32' tidak dapat dikonversi ke tipe MySQL