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

Ukládání JSON v databázi vs. mít nový sloupec pro každý klíč

Aktualizováno 4. června 2017

Vzhledem k tomu, že si tato otázka/odpověď získala určitou popularitu, usoudil jsem, že stojí za aktualizaci.

Když byla tato otázka původně zveřejněna, MySQL nemělo žádnou podporu pro datové typy JSON a podpora v PostgreSQL byla v plenkách. Od verze 5.7 MySQL nyní podporuje datový typ JSON (ve formátu binárního úložiště) a PostgreSQL JSONB výrazně dozrál. Oba produkty poskytují výkonné typy JSON, které mohou ukládat libovolné dokumenty, včetně podpory pro indexování konkrétních klíčů objektu JSON.

Stále si však stojím za svým původním prohlášením, že vaše výchozí preference při používání relační databáze by měla být stále sloupec za hodnotu. Relační databáze jsou stále stavěny na předpokladu, že data v nich budou poměrně dobře normalizovaná. Plánovač dotazů má lepší informace o optimalizaci při prohlížení sloupců než při prohlížení klíčů v dokumentu JSON. Cizí klíče lze vytvořit mezi sloupci (ale ne mezi klíči v dokumentech JSON). Důležité:pokud je většina vašeho schématu dostatečně nestálá, aby ospravedlnila použití JSON, možná budete chtít alespoň zvážit, zda je relační databáze tou správnou volbou.

To znamená, že jen málo aplikací je dokonale relačních nebo orientovaných na dokumenty. Většina aplikací má kombinaci obojího. Zde je několik příkladů, kde jsem osobně našel JSON užitečný v relační databázi:

  • Při ukládání e-mailových adres a telefonních čísel pro kontakt, kde je jejich ukládání jako hodnot v poli JSON mnohem jednodušší než správa několika samostatných tabulek

  • Uložení libovolných uživatelských předvoleb klíč/hodnota (kde hodnota může být logická, textová nebo číselná a nechcete mít samostatné sloupce pro různé typy dat)

  • Ukládání konfiguračních dat, která nemají definované schéma (pokud vytváříte Zapier nebo IFTTT a potřebujete uložit konfigurační data pro každou integraci)

Jsem si jistý, že existují i ​​další, ale toto je jen několik rychlých příkladů.

Původní odpověď

Pokud opravdu chcete mít možnost přidat tolik polí, kolik chcete, bez omezení (kromě libovolného omezení velikosti dokumentu), zvažte řešení NoSQL, jako je MongoDB.

Pro relační databáze:použijte jeden sloupec na hodnotu. Vložením objektu BLOB JSON do sloupce je prakticky nemožné dotazovat (a bolestně pomalé, když skutečně najdete dotaz, který funguje).

Relační databáze využívají při indexování výhody datových typů a jsou určeny k implementaci s normalizovaným struktura.

Jako vedlejší poznámka:to neznamená, že byste nikdy neměli ukládat JSON v relační databázi. Pokud přidáváte pravdivá metadata nebo pokud váš JSON popisuje informace, které nemusí být dotazovány a používá se pouze pro zobrazení, může být přehnané vytvořit samostatný sloupec pro všechny datové body.



  1. Prohlášení FORALL s vázanou doložkou VALUES-OF v databázi Oracle

  2. Práce se sloupci MySQL TIMESTAMP v SQL Server

  3. Příklady CURRENT_DATE – MySQL

  4. Nebyl nalezen žádný vhodný ovladač pro 'jdbc:mysql://localhost:3306/mysql