Зберігання даних у MySQL як JSON


121

Я подумав, що це потрібно зробити n00b. І так, я ніколи цього не робив. Потім я побачив, що FriendFeed це зробив і фактично покращив їх шкалу БД і зменшив затримку. Мені цікаво, чи варто це робити. І якщо так, то який правильний спосіб це зробити?

В основному, яке хороше місце, щоб навчитися зберігати все в MySQL як тип БД CouchDB? Зберігання всього так, як здається JSON, було б легше і швидше (не будувати, менше затримки).

Також, чи легко редагувати, видаляти тощо речі, що зберігаються як JSON у БД?


Для довідки, я вважаю, що це дискусія FriendFeed щодо використання JSON у MySQL: backchannel.org/blog/friendfeed-schemaless-mysql
dimo414

10
MySQL 5.7 тепер підтримує вбудований сховище даних JSON.
eecue

Відповіді:


57

CouchDB і MySQL - два дуже різні звірі. JSON - це рідний спосіб зберігання речей у CouchDB. У MySQL найкраще зробити це зберігати дані JSON у вигляді тексту в одному полі. Це повністю переможе мету зберігання його в RDBMS і значно ускладнить кожну транзакцію бази даних.

Не варто.

Сказавши це, FriendFeed, здавалося, використовував надзвичайно власну схему поверх MySQL. Це дійсно залежить від того, що саме ви хочете зберігати, навряд чи є однозначна відповідь про те, як зловживати системою баз даних, так що для вас це має сенс. Зважаючи на те, що стаття дуже стара, і їх основною причиною проти Монго і Куша була незрілість, я б переоцінив ці дві, якщо MySQL не скоротить її для вас. Вони повинні були сильно вирости до цього часу.


3
Так, я дивлюся на Mongo, і php має розширення для цього, а власне синтаксис транзакцій з БД здається простішим, ніж MySQL, і загальна робота з ним здається легшою, ніж couchDB. Дякую, я думаю, що я збираюся поїхати з MongoDB :)
Оскар Годсон

67
Звичайно, є справжні випадки зберігання крапель JSON в RDBMS. Якщо ви просто хочете зберігати та витягувати непрозорі фрагменти даних JSON, не потрібно запитувати ці дані, що трапляється досить часто в деяких сценаріях, ви можете дуже добре це зробити.
Маркус

9
@markus Я фактично роблю це на одному з моїх веб-сайтів, зокрема в полях складної форми, які ніколи не шукаються безпосередньо в запитах MySQL, але використовуються при перегляді форм (або з подання таблиці, або безпосередньо за посиланням). Це, мабуть, не ідеально, але це, безумовно, значно швидше реалізує та усуває необхідність у надмірній кількості таблиць або стовпців таблиць.
Нік Бедфорд

1
Якщо ви хочете, щоб у вашій програмі було встановлено як RDBMS, так і тип документа, тоді це хороший підхід, тому вам не потрібно керувати кількома базами даних.
rjarmstrong

5
Це досить коротка порада, можливо, хтось, хто витрачає занадто багато часу на обмін стеками? Коли у мене є запис із 100 полів, які я хочу зберігати, і мені потрібно шукати лише 3 або 4 поля, створювати таблицю зі 100 полями є безглуздим. Ви можете зберігати запис клієнта з усією його адресною книгою, що зберігається в 1 полі JSON, і просто додати ідентифікатор клієнта, прізвище, компанію як інші поля, які використовуються для пошуку записів. Це. величезна економія часу.
Даніял

102

Усі, хто коментує, здається, приходять до цього з неправильного кута, добре зберігати JSON-код через PHP у реляційній БД, і насправді буде швидше завантажувати та відображати такі складні дані, як це, однак у вас виникнуть міркування щодо дизайну, такі як пошук, індексація тощо

Найкращий спосіб зробити це - використовувати гібридні дані, наприклад, якщо вам потрібно здійснювати пошук за датою MySQL (налаштована продуктивність) буде набагато швидше, ніж PHP, і для чогось подібного пошуку відстань до місць розташування MySQL також повинно бути багато швидше (повідомлення про пошук не має доступу). Дані, за якими вам не потрібно шукати, можуть зберігатися у форматі JSON, BLOB або будь-якому іншому форматі, який ви вважаєте за потрібне.

Дані, до яких потрібно отримати доступ, дуже легко зберігаються як JSON, наприклад, основна система рахунків-фактур на кожний випадок. Вони не отримують великої користі від RDBMS, і вони можуть зберігатися в JSON просто json_encoding ($ _ POST ['entires']), якщо у вас правильна структура форми HTML.

Я радий, що ви раді використовувати MongoDB, і я сподіваюся, що він продовжує слугувати вам добре, але не думайте, що MySQL завжди не буде з вашого радара, оскільки ваш додаток збільшується по складності, і вам може знадобитися RDBMS для деякі функціональні можливості та функції (навіть якщо це лише для відставки архівованих даних або ділової звітності)


8
-1 для "добре зберігати JSON-код через PHP у реляційній БД" - Зберігання JSON (яке може представляти цілу сутність як неатомні дані) в одному полі порушує реляційну модель і запобігає 1NF. Крім того, не пред'являйте ретельних претензій щодо продуктивності без показників, щоб зробити це резервним.
Мудрець Джерард

80
Як уже згадувалося, це залежить від того, що ви зберігаєте, тобто для рахунку-фактури дійсно потрібно зберігати кожен запис окремо? НІ, ваш коментар трапляється так, як ви знаєте так багато, але 1NF не для кожного поля, або не було б BLOB і типів тексту ... це чиста дурниця для виробничої системи, вам потрібно лише оптимізувати те, що вам потрібно шукати тобто дати, ключі та встановлення індексів для деяких даних. Я не сказав зберігати все як JSON, я сказав, що зберігайте деякі дані як JSON, якщо це допоможе вирішити вашу проблему.
Льюїс Річард Філіп Каулз

2
Те, що ви говорите, є можливим і зручним, але відхилятися від добре сформованих відносин означає зробити більше роботи для адаптації та підтримки зазначених відхилень. Розбір реляційної моделі потребує кращого обґрунтування, ніж те, що ви надали. Див. «Обробка бази даних« Kroenke та Auer »для отримання додаткової інформації про ускладнення, пов’язані з вашою відповіддю, оскільки вони стосуються неправильного використання атрибутів у відносинах.
Мудрець Джерард

29
Ви припускаєте, що я не консультувався з DBA з цього питання і не розумію, що ви говорите. Я не перебуваю в циклі того, що саме стосується цього, як для невеликих систем, так і далі, але я кажу, що ви помиляєтесь і що дослідження, на яке ви вказуєте, старе, і не використовуєте наш додаток стратегія. Це просто неправильно, і проблеми лунають у поганій реалізації цього процесу. Наприклад, я не кажу, що є тільки одна модель або не використовується RDBMS, я кажу, будьте розумні про те, де ви використовуєте RDBMS і де вам не потрібно.
Льюїс Річард Філіп Каулз

6
Це була найкраща відповідь з мого досвіду. Ви можете використовувати RDBMS, але зберігати JSON лише в конкретних ситуаціях, якщо ви знаєте, що робите. Насправді я багато використовував його для тимчасового зберігання кеш-даних даних масиву та деяких інших ситуацій, коли ви досягаєте швидшого результату та менше коду. Багато проектів насправді мають деякі змішані особливості.
Героселохім

72

MySQL 5.7 Тепер підтримує вбудований тип даних JSON, схожий на MongoDB та інші сховища документів без схем:

Підтримка JSON

Починаючи з MySQL 5.7.8, MySQL підтримує вбудований тип JSON. Значення JSON не зберігаються як рядки, замість цього використовується внутрішній бінарний формат, що дозволяє швидко читати доступ до елементів документа. Документи JSON, що зберігаються у стовпцях JSON, автоматично перевіряються під час їх вставлення чи оновлення, при цьому недійсний документ видає помилку. Документи JSON нормалізуються при створенні і можуть порівнюватися за допомогою більшості операторів порівняння, таких як =, <, <=,>,> =, <>,! = І <=>; інформацію про підтримувані оператори, а також пріоритет та інші правила, яких дотримується MySQL при порівнянні значень JSON, див. Порівняння та упорядкування значень JSON.

MySQL 5.7.8 також вводить ряд функцій для роботи зі значеннями JSON. До цих функцій належать перелічені тут:

  1. Функції, які створюють значення JSON: JSON_ARRAY (), JSON_MERGE () та JSON_OBJECT (). Див. Розділ 12.16.2, «Функції, що створюють значення JSON».
  2. Функції, які шукають значення JSON: JSON_CONTAINS (), JSON_CONTAINS_PATH (), JSON_EXTRACT (), JSON_KEYS () та JSON_SEARCH (). Див. Розділ 12.16.3, «Функції, які шукають значення JSON».
  3. Функції, які змінюють значення JSON: JSON_APPEND (), JSON_ARRAY_APPEND (), JSON_ARRAY_INSERT (), JSON_INSERT (), JSON_QUOTE (), JSON_REMOVE (), JSON_REPLACE (), JSON_SET_SET (JESON_SET) Див. Розділ 12.16.4, «Функції, що змінюють значення JSON».
  4. Функції, що надають інформацію про значення JSON: JSON_DEPTH (), JSON_LENGTH (), JSON_TYPE () та JSON_VALID (). Див. Розділ 12.16.5, «Функції, які повертають атрибути значення JSON».

У MySQL 5.7.9 та пізніших версіях ви можете використовувати столбец-> шлях як скорочення для JSON_EXTRACT (стовпець, шлях). Це працює як псевдонім для стовпця, де б не був ідентифікатор стовпця в операторі SQL, включаючи пункти WHERE, ORDER BY і GROUP BY. Сюди входять SELECT, UPDATE, DELETE, CREATE TABLE та інші оператори SQL. Ліва сторона повинна бути ідентифікатором стовпця JSON (а не псевдонімом). Права сторона - це цитований вираз шляху JSON, який оцінюється по відношенню до документа JSON, повернутого як значення стовпця.

Див. Розділ 12.16.3, "Функції, які шукають значення JSON", для отримання додаткової інформації про -> та JSON_EXTRACT (). Для отримання інформації про підтримку шляху JSON в MySQL 5.7 див. Пошук та зміна значень JSON. Див. Також Вторинні індекси та віртуально згенеровані стовпці.

Більше інформації:

https://dev.mysql.com/doc/refman/5.7/en/json.html


26

Персонажі json не є нічого особливого, якщо мова йде про сховище, такі символи як

{, }, [, ], ', a-z, 0-9.... немає нічого особливого , і можуть бути збережені в вигляді тексту.

Перша проблема, з якою у вас виникне, це така

{profile_id: 22, ім'я користувача: 'Robert', пароль: 'skhgeeht893htgn34ythg9er'}

що зберігається в базі даних, не так просто оновити, якщо у вас не було власної роботи та розроблено jsondecode для mysql

UPDATE users SET JSON(user_data,'username') = 'New User';

Отже, як ви не можете цього зробити, вам доведеться спочатку ВИБІРИТЕ json, розшифрувати його, змінити його, оновити, так що теоретично ви могли б витратити більше часу на створення відповідної структури бази даних!

Я використовую json для зберігання даних, але тільки Meta Data, дані, які часто не оновлюються, не пов’язані з конкретним користувачем. Наприклад, якщо користувач додає публікацію, і в цій публікації він додає зображення, які розбирають зображення, створюють великі пальці та потім скористайтеся URL-адресами великого пальця у форматі json.


Чи достатньо добре зберігати рядок json в базі даних, коли я її зовсім не оновлюю? Я просто хочу здійснити звичайний пошук даних json за допомогою LIKE. Я бачу, що навіть Wordpress зберігає метадані плагіна як json рядок у базі даних.
shasi kanth

@shasikanth, якщо ви шукаєте значення в даних JSON, то я б шукав кращого підходу
Кірбі

15

Щоб проілюструвати, як важко отримати дані JSON за допомогою запиту, я поділюсь запитом, який я створив для цього.

Він не враховує масиви та інші об'єкти, а лише основні типи даних. Ви повинні змінити 4 екземпляри стовпця на ім'я стовпця, що зберігає JSON, а 4 екземпляри мого поля на поле JSON, до якого ви хочете отримати доступ.

SELECT
    SUBSTRING(
        REPLACE(REPLACE(REPLACE(column, '{', ''), '}', ','), '"', ''),
        LOCATE(
            CONCAT('myfield', ':'),
            REPLACE(REPLACE(REPLACE(column, '{', ''), '}', ','), '"', '')
        ) + CHAR_LENGTH(CONCAT('myfield', ':')),
        LOCATE(
            ',',
            SUBSTRING(
                REPLACE(REPLACE(REPLACE(column, '{', ''), '}', ','), '"', ''),
                LOCATE(
                    CONCAT('myfield', ':'),
                    REPLACE(REPLACE(REPLACE(column, '{', ''), '}', ','), '"', '')
                ) + CHAR_LENGTH(CONCAT('myfield', ':'))
            )
        ) - 1
    )
    AS myfield
FROM mytable WHERE id = '3435'

5
Ви б не запитували цю сторону сервера через тхо. Це було б для зберігання краплі і повернення його на сторону клієнта. Тоді ви просто використовувати JS для запиту. Це було дуже давно Тхо :) Я з тих пір перейшов до MongoDB для цього матеріалу :) Оновлення для цього досить тонкого запиту Тхо.
Оскар Годсон

Я думаю, це питання про те, чи буде людина регулярно отримувати доступ до цих даних JSON. Наприклад, я переміщую несуттєві заголовки до масиву, розбираю JSON та зберігаю. Коли я завантажу JSON (для рідкісного запиту AJAX на додаткові заголовки), я просто вийду з MySQL, прочитаю JSON в масив і відлунювати заголовки. Для нічого більш інтенсивного використання даних, ймовірно, він не повинен зберігатися як JSON.
Джон

10

Це дійсно залежить від вашого випадку використання. Якщо ви зберігаєте інформацію, яка абсолютно не має значення для звітування, і не будете запитуватися через JOIN з іншими таблицями, можливо, вам буде доцільно зберігати свої дані в одному текстовому полі, закодованому як JSON.

Це може значно спростити вашу модель даних. Однак, як зазначав РобертПітт, не сподівайтеся, що зможете поєднати ці дані з іншими нормалізованими даними.


2
Мої думки точно. Якщо його дані, які ніколи не приєднуються / не шукаються або навіть рідко оновлюються, чому б не використовувати json у полі TEXT. Хорошим прикладом цього є таблиця fooditem, де кожен харчовий продукт повинен зберігати інформацію про харчування. Розмір порції, протеїн, вуглеводи, загальний вміст жиру, жирність тощо. Але не тільки це, вам потрібно буде зберігати значення (0,2) та одиницю, яку він вимірював (g, oz, fl oz, ml). Враховуючи, що це дані, які (в залежності від того, що ви робите, я думаю) не потрібно шукати, я б сказав, що 1 TEXT vs 16 int / varchar / enum стовпців - це хороша компроміс.
Бред Мур

Саме !!! Це корисно, коли вам потрібно зберігати змінну та / або невідому структуру даних, яку взагалі не плануєте фільтрувати за допомогою SQL. Дані просто зберігаються як є, і хтось інший (код програми) може знати структуру і що з нею робити.
Дельмо

9

Це давнє запитання, але я все ще в змозі побачити це у верхній частині результату пошуку Google, тому я думаю, було б доцільно додати нову відповідь через 4 роки після того, як запитання було поставлено.

Перш за все, є краща підтримка для зберігання JSON в RDBMS. Ви можете розглянути можливість переходу на PostgreSQL (хоча MySQL підтримує JSON з версії 5.7.7). PostgreSQL використовує дуже схожі команди SQL, як MySQL, за винятком того, що вони підтримують більше функцій. Однією з функцій, які вони додали, є те, що вони надають тип даних JSON, і тепер ви можете запитувати збережений JSON. ( Деякі посилання на це ) Якщо ви не робите запит безпосередньо у вашій програмі, наприклад, використовуючи PDO в php або красномовно в Laravel, все, що вам потрібно зробити, це просто встановити PostgreSQL на вашому сервері та змінити налаштування підключення до бази даних. Вам навіть не потрібно змінювати код.

Здебільшого, як підказали інші відповіді, зберігання даних як JSON безпосередньо в RDBMS не є хорошою ідеєю. Однак є деякі винятки. Я можу придумати ситуацію - поле зі змінною кількістю пов'язаного запису.

Наприклад, для зберігання тегів допису в блозі зазвичай потрібно мати таблицю для публікації в блозі, таблицю тегів і відповідну таблицю. Отже, коли користувачеві хочеться відредагувати публікацію, і вам потрібно буде відобразити, який тег пов’язаний з цією публікацією, вам потрібно буде запитати 3 таблиці. Це значно пошкодить продуктивність, якщо ваша відповідна таблиця / таблиця тегів довга.

Зберігаючи теги як JSON у таблиці публікацій блогу, ця сама дія вимагає лише пошуку однієї таблиці. Користувач зможе побачити публікацію в блозі для швидшого редагування, але це пошкодить продуктивність, якщо ви хочете скласти звіт про те, яку публікацію пов’язано з тегом, або, можливо, шукати за тегом.

Ви також можете спробувати знешкодити базу даних. Дублюючи дані та зберігаючи дані обома способами, ви можете отримати переваги обох методів. Вам просто знадобиться трохи більше часу для зберігання даних і більше місця для зберігання (що дешево порівняно з вартістю більшої обчислювальної потужності)


8

Я б сказав, що єдиними двома причинами вважати це:

  • продуктивність просто недостатньо хороша при нормалізованому підході
  • ви не можете легко моделювати ваші особливо текучі / гнучкі / зміни даних

Тут я написав трохи про власний підхід:

З якими проблемами масштабування ви стикалися при використанні магазину даних NoSQL?

(див. верхню відповідь)

Навіть JSON не був досить швидким, тому ми використовували підхід до формату тексту на замовлення. Працював / продовжує добре працювати для нас.

Чи є причина, що ви не використовуєте щось на зразок MongoDB? (може бути, MySQL потрібен; просто цікаво)


6

Мені здається, що кожен, хто відповідає на це запитання, начебто не вистачає однієї критичної проблеми, крім @deceze - використовувати правильний інструмент для роботи . Ви можете змусити реляційну базу даних зберігати майже будь-який тип даних, і ви можете змусити Монго обробляти реляційні дані, але якою ціною? Ви в кінцевому підсумку представляєте складність на всіх рівнях розробки та обслуговування - від розробки схеми до коду програми; не кажучи вже про хіт вистави.

У 2014 році ми маємо доступ до багатьох серверів баз даних, які надзвичайно добре обробляють конкретні типи даних.

  • Монго (зберігання документів)
  • Redis (зберігання даних ключових значень)
  • MySQL / Maria / PostgreSQL / Oracle / тощо (реляційні дані)
  • CouchDB (JSON)

Я впевнений, що я пропустив деяких інших, таких як RabbirMQ та Cassandra. Моя думка, використовувати правильний інструмент для даних, які потрібно зберігати.

Якщо ваша програма вимагає зберігання та пошуку різноманітних даних дійсно, дуже швидко, (а хто ні) не ухиляйтесь від використання декількох джерел даних для програми. Найбільш популярні веб-рамки підтримують безліч джерел даних (Rails, Django, Grails, Cake, Zend тощо). Ця стратегія обмежує складність однією конкретною областю програми, ORM або інтерфейсом джерела даних програми.


1
На ваш погляд, RabbitMQ - це сервер баз даних чи щось таке? Я б сказав, що це посередницьке програмне забезпечення, орієнтоване на повідомлення, з приємною особливою наполегливістю для того, щоб не втрачати жодних повідомлень, але нічого, з чим я б не зберігав дані. Всього два мої центи.
Осиріз

@Osiriz: Ви маєте рацію. Я, мабуть, не повинен був включати це в цю дискусію.
CheddarMonkey

5

Ось функція, яка зберігає / оновлює ключі масиву JSON у стовпці та інша функція, яка отримує значення JSON. Ці функції створюються, припускаючи, що назва стовпця для зберігання масиву JSON - json . Він використовує PDO .

Функція збереження / оновлення

function save($uid, $key, $val){
 global $dbh; // The PDO object
 $sql = $dbh->prepare("SELECT `json` FROM users WHERE `id`=?");
 $sql->execute(array($uid));
 $data      = $sql->fetch();
 $arr       = json_decode($data['json'],true);
 $arr[$key] = $val; // Update the value
 $sql=$dbh->prepare("UPDATE `users` SET `json`=? WHERE `id`=?");
 $sql->execute(array(
   json_encode($arr), 
   $uid
 ));
}

де $ uid - ідентифікатор користувача, $ ключ - ключ JSON для оновлення, а його значення згадується як $ val .

Отримати значення функції

function get($uid, $key){
 global $dbh;
 $sql = $dbh->prepare("SELECT `json` FROM `users` WHERE `id`=?");
 $sql->execute(array($uid));
 $data = $sql->fetch();
 $arr  = json_decode($data['json'], true);
 return $arr[$key];
}

де $ key - це ключ масиву JSON, з якого нам потрібне значення.


1
Це не вдається в конфліктних випадках, що робити, якщо щойно прочитаний json оновлюється іншим процесом, а потім ви зберігаєте json у поточному потоці, перезаписуючи його? Можливо, вам знадобляться такі SELECT FOR UPDATEблоки, як версія чи версія в даних json.
DhruvPathak

@DhruvPathak Чи можете ви, будь ласка, оновити відповідь, скориставшись SELECT FOR UPDATEтак, щоб було краще. Я не знаю, як це використати.
Субін

3

Рання підтримка зберігання JSON в MySQL була додана до випуску лабораторій MySQL 5.7.7 JSON ( бінарні файли Linux , джерело )! Здається, випуск вийшов із ряду визначених користувачем функцій JSON, оприлюднених ще у 2013 році .

Здається, ця початкова підтримка JSON ведеться у дуже позитивному напрямку, включаючи перевірку JSON на INSERT, оптимізований формат бінарного зберігання, що включає таблицю пошуку в преамбулі, що дозволяє функції JSN_EXTRACT виконувати бінарні пошуки, а не аналізувати кожен доступ. Існує також цілий ряд нових функцій для обробки та запиту конкретних типів даних JSON:

CREATE TABLE users (id INT, preferences JSON);

INSERT INTO users VALUES (1, JSN_OBJECT('showSideBar', true, 'fontSize', 12));

SELECT JSN_EXTRACT(preferences, '$.showSideBar') from users;

+--------------------------------------------------+
| id   | JSN_EXTRACT(preferences, '$.showSideBar') |
+--------------------------------------------------+
| 1    | true                                      |
+--------------------------------------------------+

IMHO, вищезазначене є чудовим випадком використання для цього нового функціоналу; у багатьох базах даних SQL вже є таблиця користувачів, і замість того, щоб вносити нескінченні зміни схеми для розміщення набору налаштувань користувачів, JOINідеальним є наявність одного стовпчика JSON . Тим більше, що малоймовірно, що коли-небудь його потрібно буде запитувати за окремими предметами.

Хоча це ще рано, команда MySQL сервер робить велику роботу по інформуванню про зміни на в блозі .


2

Я вважаю, що зберігання JSON в базі даних mysql насправді перешкоджає використанню RDBMS так, як воно призначене для використання. Я б не використовував його в будь-яких даних, якими маніпулював би в якийсь момент або повідомлявся про них, оскільки це не тільки додає складності, але й може легко вплинути на продуктивність залежно від способу його використання.

Однак мені було цікаво, якщо хтось ще не подумав про можливу причину насправді зробити це. Я думав зробити виняток для цілей журналу. У своєму випадку я хочу реєструвати запити, які мають змінну кількість параметрів та помилок. У цій ситуації я хочу використовувати таблиці для типу запитів та самих запитів із рядком JSON різних значень, які були отримані.

У наведеній вище ситуації запити реєструються і ніколи не маніпулюються та не індексуються в рядковому полі JSON. ЯКЩО в складнішому середовищі я, мабуть, спробував би використовувати щось, що має більше наміру для цього типу даних, і зберігати їх у цій системі. Як говорили інші, це дійсно залежить від того, що ви намагаєтеся досягти, але дотримання стандартів завжди допомагає довголіття та надійності!


2

JSON є дійсним типом даних і в базі даних PostgreSQL. Однак база даних MySQL ще офіційно не підтримує JSON. Але це випічка: http://mysqlserverteam.com/json-labs-release-native-json-data-type-and-binary-format/

Я також погоджуюся, що існує багато дійсних випадків, коли деякі дані краще серіалізувати на рядок у базі даних. Основна причина може полягати в тому, що вона не регулярно запитується, і коли її власна схема може змінюватися - ви не хочете змінювати відповідну схему бази даних. Друга причина - коли серіалізована рядок знаходиться безпосередньо з зовнішніх джерел, ви, можливо, не захочете розбирати їх і подавати в базу даних будь-якою ціною, поки не скористаєтесь жодними. Тож я буду чекати, коли новий реліз MySQL підтримуватиме JSON, оскільки тоді буде легше перемикатися між різними базами даних.


1

Я використовую json для запису будь-якого проекту, фактично використовую три таблиці! один для даних у json, один для індексу всіх метаданих структури json (кожен мета кодується унікальним ідентифікатором) та один для користувача сесії, і це все. Орієнтовний показник не може бути кількісно визначений в цьому ранньому стані коду, але для прикладу я мав представлення користувачів (внутрішнє приєднання до індексу), щоб отримати категорію (або що-небудь, як користувач, ...), і це було дуже повільно (дуже-дуже повільно , використаний погляд у mysql - це не найкращий спосіб). Модуль пошуку в цій структурі може робити все, що завгодно, але, я думаю, mongodb буде ефективнішим у цій концепції повного запису даних json. Для мого прикладу я переглядаю користувачі, щоб створити дерево категорії і паніровку, мій боже! стільки запитів зробити! сам апач пішов! і, власне, для цього маленького веб-сайту я використовую знаю php, який генерує дерево та сухарі, вилучення даних здійснюється пошуковим модулем (який використовує лише індекс), таблиця даних використовується лише для оновлення. Якщо я хочу, я можу знищити всі індекси та регенерувати їх з кожними даними та виконати зворотну роботу, наприклад, знищити всі дані (json) та відновити їх лише за допомогою таблиці індексів. Мій проект молодий, працює під php та mysql, але колись я використовую node js та mongodb, буде більш ефективним для цього проекту.

Використовуйте json, якщо ви думаєте, що можете зробити, просто для цього, тому що можете! і, забудьте, якщо це була помилка; спробуйте зробити добрий чи поганий вибір, але спробуйте!

Низький

французький користувач


1
Не зрозумів. Я не розмовляю англійською мовою, але рекомендую вам використовувати точки (.), Коми (,) та абзаци (клавіша Enter) для організації своїх ідей. Тоді лише тоді спробуйте організувати базу даних ;-)
Дієго Янчич

Ви маєте рацію, насправді плутайте відповідь, маєте бути більш чіткими, показуючи приклад. Але, якщо mysql можна замінити mongoDB, ефективніше буде використовувати json (як рідний для mongodb), якщо mysql є обов'язковим, добре, спробуємо ще раз через кілька днів!
низький

1

Я знаю, що це дуже пізно, але у мене була схожа ситуація, коли я використовував гібридний підхід до підтримки стандартів RDBMS щодо нормалізації таблиць до точки, а потім зберігав дані в JSON як текстове значення за межами цієї точки. Так, наприклад, я зберігаю дані в 4 таблицях, дотримуючись правил нормалізації RDBMS. Однак у 4-й таблиці для розміщення динамічної схеми я зберігаю дані у форматі JSON. Кожен раз, коли я хочу отримати дані, я отримую дані JSON, розбираю їх та показую на Java. Це працювало для мене до цих пір, і щоб гарантувати, що я все ще в змозі проіндексувати поля, які я перетворюю на дані json у таблиці, нормалізовано за допомогою ETL. Це гарантує, що користувач працює над додатком і стикається з мінімальним відставанням, і поля трансформуються у дружній формат RDBMS для аналізу даних тощо.


0

Ви можете використовувати цей гіст: https://gist.github.com/AminaG/33d90cb99c26298c48f670b8ffac39c3

Встановивши його на сервер (просто потрібна привілей root не супер), ви можете зробити щось подібне:

select extract_json_value('{"a":["a","2"]}','(/a)')

Він повернеться. a 2 Ви можете повернути що-небудь всередині JSON, скориставшись цим. Хороша частина полягає в тому, що він підтримує MySQL 5.1,5.2,5.6. І вам не потрібно встановлювати жодних бінарних файлів на сервер.

На основі старого проекту common-schema, але він працює і сьогодні https://code.google.com/archive/p/common-schema/


тепер суть 404
neoDev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.