@awenn2015
Веб-программист самоучка

Как лучше выстроить связи таблиц в бд на основе json файла?

Всем привет, в одном проекте который изначально был без админки и для хранения данных использовал конфиг json на сервере который напрямую редактировался и тд, я решил это самое дело поправить и вынести в бд, использую orm redbeenphp (единственная с которой я когда то работал, как такого опыта со сложными sql запросами нет, максимум переименовать, создать или удалить по этому использую orm)

Вот пример самого json конфига:

{
  "metaInfo": {
    "title": "Торшеры напольные в современном стиле - купить с бесплатной доставкой в магазине #####!",
    "description": "Торшеры напольные в современном стиле купить с оплатой при получении и бесплатной доставкой. Большой выбор моделей, все в наличии на складе. Звоните, заказывайте!",
    "keywords": "Торшеры напольные в современном стиле"
  },
  "siteMetrics": {
    "head": "\/metrics.html",
    "footer": ""
  },
  "siteInfo": {
    "description": "Крупнейший поставщик<br>освещения",
    "phone": {
      "pretty": "#####",
      "link": "#####",
      "text": "Звонок бесплатный"
    },
    "currencySymbol": " ₽"
  },
  "preview": {
    "titleForm": "Оставить заявку на подбор",
    "titlePreview": "Торшеры напольные в современном стиле",
    "listPreview": [
      {
        "text": "<span>Бесплатная доставка<\/span> по всей России"
      },
      {
        "text": "Оплата при <span>получении<\/span>"
      },
      {
        "text": "Все товары <span>в наличии<\/span>"
      }
    ],
    "listImage": "\/icons\/tick-white-icon.svg",
    "imageRight": "\/torsher-loft.png",
    "backgroundImage": "\/bg-2.jpg",
    "linksToOtherProducts": []
  },
  "why": [
    {
      "image": "\/icons\/china-icon.svg",
      "text": "Работаем напрямую с производителями"
    },
    {
      "image": "\/icons\/container-icon.svg",
      "text": "Все товары в наличии на складе"
    },
    {
      "image": "\/icons\/truck-icon.svg",
      "text": "Совершенная логистика, отработанная годами"
    },
    {
      "image": "\/icons\/2-icon.png",
      "text": "Года гарантии на все товары"
    }
  ],
  "catalog": {
    "title": "Каталог торшеров в современном стиле",
    "productsFile": "file-16.json",
    "filterSticky": true,
    "loadingModeNewProducts": "by-scrolling"
  },
  "discount": {
    "title": "Получите дополнительную скидку",
    "subtitle": "Обеспечим лучшее предложение по цене",
    "image": "\/icons\/lock-icon.svg"
  },
  "lider": {
    "title": "#####! — Лидер в области светотехники",
    "subtitle": "Мы работаем как с розничными клиентами, так и с крупными оптовиками, дизайнерами и девелоперами",
    "blocks": [
      {
        "image": "\/icons\/container-icon.svg",
        "title": "<span>3<\/span> склада",
        "text": "На территории РФ"
      },
      {
        "image": "\/icons\/warehouse-icon.svg",
        "title": "Более <span>120<\/span>",
        "text": "Брендов производителей"
      },
      {
        "image": "\/icons\/assortment-icon.svg",
        "title": "Более <span>110 000<\/span> товаров",
        "text": "В наличии на складе более 50 000"
      }
    ]
  },
  "footer": {
    "copyright": "© %year% #####! Все права защищены."
  },
  "landOptions": {
    "useCatalogSection": false,
    "rootCategories": [],
    "rootSubCategories": [],
    "manualHTMLStructure": "",
    "orderManualStructure": "none",
    "bodyClass": ""
  }
}


Изначально идея была просто создать одну таблицу со всеми ключами (metaInfo, siteMetrics) и просто кинуть json туда но решил что это не совсем правильно, дальше решил разбить таблицу по основным ключам configs (Системная информация которая нужна для админки которую я делаю) и связанные с ней подтаблицы configs_sitemetrics и тд и в итоге набросал пока что такой код

$path = 'http://example.com/content/sovremennye-torshery.json';
  $data = json_decode(file_get_contents($path), true);
  $tablePrefix = "configs";
  
  $withNesting = fn(array $key) => join("_", $key);
  
  $withPrefix = function (string $key) use ($tablePrefix) {
    $key[0] = strtoupper($key[0]);
    return "{$tablePrefix}" . strtolower($key);
  };
  
  /* Основа */
  
  $userId = 4;
  $user = R::load('users', $userId);
  $config = R::dispense($tablePrefix);
  $user["ownConfigList"][] = $config;
  
  $config["name"] = "Sovremennye torshery";
  $config["description"] = null;
  $config["file"] = "sovremennye-torshery";
  $config["added"] = "2022-11-07T00:46:15+03:00";
  $config["modified"] = "2022-12-14T18:03:32+03:00";
  $config["author"] = $user["login"];
  
  /* Сохранение конфига */
  
  R::store($user);
  
  /* Модули */
  
  $dataKey = "metaInfo";
  $cSiteMetrics = R::dispense($withPrefix($dataKey));
  
  $cSiteMetrics["configs"] = $config;
  $cSiteMetrics["title"] = $data[$dataKey]["title"];
  $cSiteMetrics["description"] = $data[$dataKey]["description"];
  $cSiteMetrics["keywords"] = $data[$dataKey]["keywords"];
  
  R::store($cSiteMetrics);
  
  /*  */
  
  $dataKey = "siteMetrics";
  $cMetaInfo = R::dispense($withPrefix($dataKey));
  
  $cMetaInfo["configs"] = $config;
  $cMetaInfo["head"] = $data[$dataKey]["head"];
  $cMetaInfo["footer"] = $data[$dataKey]["footer"];
  
  R::store($cMetaInfo);
  
  /*  */
  
  $dataKey = "siteInfo";
  $cSiteInfo = R::dispense($withPrefix($dataKey));
  
  $cSiteInfo["configs"] = $config;
  $cSiteInfo["description"] = $data[$dataKey]["description"];
  $cSiteInfo["currencySymbol"] = $data[$dataKey]["currencySymbol"];
  
  R::store($cSiteInfo);
  
  /*  */
  
  $dataKey = ["siteInfo", "phone"];
  $cSiteInfoPhone = R::dispense($withPrefix("siteInfoPhone"));
  
  $cSiteInfoPhone["siteinfo"] = $cSiteInfo;
  $cSiteInfoPhone["pretty"] = $data[$dataKey[0]][$dataKey[1]]["pretty"];
  $cSiteInfoPhone["link"] = $data[$dataKey[0]][$dataKey[1]]["link"];
  $cSiteInfoPhone["text"] = $data[$dataKey[0]][$dataKey[1]]["text"];
  
  R::store($cSiteInfoPhone);


Не совсем понимаю правильно ли делаю или стоит например ту же таблицу phone перести выше и хранить в виде json
  • Вопрос задан
  • 137 просмотров
Пригласить эксперта
Ответы на вопрос 1
@rPman
Json в базе данных хранить имеет смысл только если в процессе жизни структура этих данных не определена, не формализована (т.п. может меняться от объекта к объекту), и в любом случае от этого нужно уходить.

Случаи, когда можно поступиться со своей ленью и обединять данные в json, это когда части этих данных не мыслимы друг без друга и меняються скорее тоже вместе, отличный пример - настройки подключения к базе данных можно не делать по полям сервер, ИП, логин, пароль, а хранить сразу одной строкой, как то сериализованной, пусть и json. Был пример, когда шел процесс переделки однопроцессорного сервиса на многопроцессорнй кластер и переноса хранения настроек и характеристик заданий из файлов в бд, там json был оправдан, записи фактически олицетворяли файлы.

Списочные данные, особенно если по ним нужно поиск а на элементы списка где то в других записях ссылаются, однозначно лучше хранить как записи бд и не json.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы