项目作者: ruslan-avantis

项目描述 :
Database structure for Standard «APIS-2018»
高级语言:
项目地址: git://github.com/ruslan-avantis/structure-db.git
创建时间: 2017-12-14T13:16:32Z
项目社区:https://github.com/ruslan-avantis/structure-db

开源协议:MIT License

下载


Структура баз данных

Проектирование структуры базы данных важнейшая задача при создании любой CMS.

Вышла 1.0.1-BETA-3

В 1.0.1-BETA-3 проработаны 24 основные ресурса (таблицы). Минимальный набор для легкого интернет-магазина.

Наш подход к проектировании базы данных

Главное это: максимальная скорость доступа к данным и минимальное количество колонок в самых запрашиваемых ресурсах.

  • Пример: одна числовая колонка в ресурсе с 1 млн. записей может занимать более 50 Мб.

Му уверены в том, если возможно обойтись колонкой в одном ресурсе и не дублировать эту колонку на двух ресурсах, нужно поступать именно так. Мы считаем что такой подход дает более широкие возможности (хранить несколько описаний товара или несколько цен), а также не сильно уступает по скорости доступа, чем запрос конкретного id. Учитывая что файл table_name.json открывается для чтения полностью, то по скорости при наличии достаточного количества оперативной памяти нет особой разницы искать один id или несколько price_id.

  • Пример: В таблице product мы убрали прямую связь с ресурсами:
    description,
    seo,
    og,
    price

Необходимо максимально группировать данные с потенциально большим объемом.

  • Пример: Тексты, Картинки - одн ресурс для текстов и один для картинок на всю базу данных.

Мы очень верим в то что вы поможете ее усовершенствовать !

Использование в API Shop

  • Скачайте файл db.json отредактируйте его если вы хотите внести свои дополнения.
  • Скопируйте файл в папку ваша_бд/core/ и база данных api-json-db или API Shop автоматически создаст новые ресурсы.

Поддерживаемые типы данных в structure-db

  • boolean — Логический тип true или false
  • integer — Целое число
  • double — Число с плавающей точкой
  • string — Строка

Используется функция gettype — Возвращает тип переменной

Мы используем два id. Зачем ?

Например ресурс user имеет id и user_id

Ответ очень прост

structure-db проектируется с учетом того что данные будут приходить из API сторонних платформ и ресурсов. Таким образом при создании новых записей в ресурсе id будет локальным и иметь свою очередность, а user_id будет приходить извне и через него будут связаны данные в базе.

Параметр relations

relations - Очень важный параметр запроса позволяющий получать в ответе необходимые данные из других связанных ресурсов.

Для передачи дополнительных параметров в json формате с последующим кодированием данных в формат MIME base64 функцией base64_encode

Параметры: Название связаного ресурса равно "all" или строка с параметрами

В нашем запросе к ресурсу мы хотим дополнительно получить:

  • product - товары в заказе
  • user - данные покупателя
  • address - данные адреса покупателя

Пример формирования параметра relations

  1. "relations" => base64_encode('{
  2. "product": "all",
  3. "user": ["phone","email","fname","iname","oname"],
  4. "address": "all"
  5. }')

Структура базы состоит из 24 основных ресурсов

Глобальные

  • site - Конфигурация сайта
  • language - Мультиязычность

    Товары

  • price - Товары для вывода на сайте
  • category - Категории
  • product - Товары (Виртуальный каталог)
  • type - Типы товара
  • brand - Бренды
  • serie - Серии товара
  • images - Изображения
  • seo - SEO тексты
  • description - Описания и тексты
  • params - Свойства товара

    Пользователи

  • role - Роли пользователей
  • user - Пользователи
  • contact - Контактные данные
  • address - Адреса

    Корзина

  • currency - Валюты
  • cart - Корзина
  • order - Заказы
  • pay - Оплаты

    Контент

  • article - Статьи
  • article_category - Категории статей

    Технические

  • cached - Кеш
  • queue - Очередь запросов

    Установка

  • stores_list - Список магазинов
  • templates_list - Список шаблонов

В разработке еще 70+ дополнительных ресурсов

Глобальные

  • menu - Меню
  • account - Счета
  • corporation - Юридические лица

    Цены на сайте

  • seller - Конфигурация продавца
  • price_rule - Ценовые правила продавца

    Поставщики и Прайс-листы

  • price_list - Прайс-листы
  • price_list_rule - Ценовые правила
  • supplier - Поставщики
  • supplier_currency - Курсы валют поставщиков
  • supplier_account - Юр. лица поставщиков (связь с таблицей account)

    Свойства товаров

  • property_product - Свойства товара
  • property - Настройки и связи набора и списка свойств
  • property_set - Наборы свойств
  • property_list - Список свойств
  • property_value - Значения свойств

    Отзывы

    При создании отзыва автоматически создается Тикет, что дает возможность проконтролировать реакцию персонала на отзывы клиентов.
  • review - Отзывы и обзоры
  • comment - Коментарии
  • rating - Рейтинги: отзывов, коментарией итд.

    Адреса

  • База адресов может быть покупная или собираться автоматически в процессе работы сайта
  • location - База адресов
  • country - Страна
  • region - Область (регион)
  • postal_code - Почтовый индекс
  • city - Город (населенный пункт)
  • district - Район города
  • street - Улица

    Товары

  • complect - Комплекты: Товар состоит из …
  • buytogether - Вместе дешевле
  • relevance - Релевантность, Популярность, Рейтинг

    Маркетинг

  • customer - Клиенты
  • promo_code - Промо коды
  • discount_card - Дисконтные карты
  • special_offer - Специальные предложения
  • proposals - Предложения

    ERP

  • person - Сотрудники компании, поставщиков итд.
  • invoice - Счета
  • invoice_product - Товары в счетах
  • invoice_product_status - Статусы товаров
  • contract - Договора
  • payment - Платежи
  • payment_type - Типы платежей
  • payment_resource - Ресурсы платежей
  • delivery - Доставка
  • delivery_options - Способы доставки
  • reclamation - Рекламации
  • bill - Приходные накладные
  • bill_move - Накладные перемещения
  • bill_product - Товары в приходных накладных
  • inventarization - Инвентаризация
  • inventarization_item - Товары в инвентаризации

    Логи и история

  • history_order - История заказов
  • history_invoice - История счетов
  • history_product - История товаров
  • history_payment - История платежей
  • error - Лог ошибок
  • redirect - Редиректы

    API

  • api - Ключи доступа к API
  • api_request - Запросы к API
  • api_response - Ответы сервисов на запрос к ихним API

    Тикет система - Связь

  • ticket - Основная таблица тикет системы
  • ticket_category - Категории тикетов
  • ticket_status - Статусы и связи тикетов
  • ticket_message - Сообщения
  • message - Сообщения
  • question - Вопросы с сайта

    Подписки и рассылки (email, sms итд.)

  • subscription - Подписки на рассылки
  • sending - Рассылки
  • sending_set - Настройки рассылок
  • sending_statistic - Статистика рассылок

    Боты и машинное обучение

  • bot - Типы и настройки ботов
  • chat_bot - Бот роутер - через него проходит общение между ботами и пользователями
  • support_bot - Бот автоматически отвечает на популярные вопросы до покупки
  • service_bot - Бот автоматически отвечает на популярные вопросы после покупки
  • search_bot - Бот помогающий в поиске по сайту
  • view_bot - Бот на основании интересов пользователя предлагает товары
  • seller_bot - Бот продавец-консультант
  • storage_bot - Бот отвечающий по наличию товара
  • order_bot - Бот дает информацию по заказам
  • archive - Общий архив информации для всех ботов

Префиксы ресурсов и колонок

Для дополнительной безопасности в начале названия ресурсов или колонок может быть указан префикс

Установить префиксы

  1. $db->setPrefixTable("sf"); // Установить префикс ресурса
  2. $db->setPrefixColumn("jhbg5r"); // Установить префикс колонки

Результат:

  • sf_user - Ресурс user
  • jhbg5r_login - Колонка login

Использование в MySql

Если вам подходит наша структура базы данных, вы может использовать ее в своих проектах.

Пример скрипта на PHP для создания ресурсов (таблиц) в базе MySQL из файла db.json

  1. $uri_db = "db.json";
  2. if (file_exists($uri_db)){
  3. // Загрузить файл db.json
  4. $db = json_decode(file_get_contents($uri_db), true);
  5. if (count($db) >= 1) {
  6. // Подключаетесь к базе
  7. $link = mysqli_connect($host, $user, $password, $database) or die("Ошибка " . mysqli_error($link));
  8. if (!$link) {exit;}
  9. foreach($db as $table){
  10. // Если существует колонка table
  11. if (isset($table["table"])) {
  12. if (count($table["schema"]) >= 1 && $table["action"] == "create") {
  13. $row = "";
  14. foreach($table["schema"] as $key => $value){
  15. if (isset($key) && isset($value)) {
  16. if ($key != "id" && preg_match("[a-z0-9_]", $key)) {
  17. if ($value == "boolean" || $value == "string" ||
  18. $value == "integer" || $value == "double") {
  19. // Конвертируем тип
  20. $value = str_replace("boolean", "CHAR( 5 ) NOT NULL DEFAULT ''", $value);
  21. $value = str_replace("text", "TEXT NOT NULL DEFAULT ''", $value);
  22. $value = str_replace("datetime", "DATETIME NOT NULL", $value);
  23. $value = str_replace("string", "VARCHAR( 255 ) NOT NULL DEFAULT ''", $value);
  24. $value = str_replace("integer", "INT( 11 ) NOT NULL DEFAULT '0'", $value);
  25. $value = str_replace("double", "FLOAT( 11, 2 ) NOT NULL DEFAULT '0.00'", $value);
  26. $row .= ", ".$key." ".$value;
  27. } else {
  28. echo "название поля или тип данных не определены";
  29. }
  30. } else {
  31. echo $key." не прошел проверку preg_match [a-z0-9_]";
  32. }
  33. } else {
  34. echo "value у ".$key." должен иметь один из типов: boolean, string, integer, double";
  35. }
  36. }
  37. if (!mysql_query("SELECT * FROM `".$table["table"]."`")){
  38. // Создаем таблицу
  39. $query ="CREATE TABLE IF NOT EXISTS ".$table["table"]."(
  40. id INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY".$row."
  41. )";
  42. } else {
  43. // Обновляем существующую таблицу
  44. $query ="ALTER TABLE ".$table["table"]."
  45. CHANGE id INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY".$row;
  46. }
  47. // Отправляем запрос
  48. mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));
  49. } else {
  50. echo "У ".$table["table"]." отсутствует schema или action != create";
  51. }
  52. } else {
  53. echo "Название одной из таблиц не определено";
  54. }
  55. }
  56. // Закрываем соединение с БД
  57. mysqli_close($link);
  58. echo "Создание таблиц прошло успешно";
  59. return true;
  60. } else {
  61. echo "Таблицы в файле db.json не найдены";
  62. return false;
  63. }
  64. } else {
  65. echo "По указанному пути ".$uri_db." файл не найден";
  66. return false;
  67. }

При желании можно дописать автоматическое создание индексов и связей.

При очень больших файлах ресурсов (свыше 1 млн. записей) мы предлагаем разбивать хранение данных ресурса на несколько файлов.

Идеи

Разбивка системы хранения ресурса на несколько файлов по указанному лимиту записей

Описание идеи:

  • Ставим лимит для одного файла 100.000 записей
  • resource_name - первый файл ресурса содержит в 10 раз меньше записей чем выставлено в лимите, это самые часто запрашиваемые данные, база индексирует по полю score количеству запросов. Доступ к самым популярным данным всегда будет минимум в 10 раз быстрее чем к менее популярным.
  • resource_name_1 - содержит от id=1 до id=100000
  • resource_name_2 - содержит от id=100001 до id=200000
  • Записи не смещаются вверх при удалении и id=100002 не может попасть в файл resource_name_1 даже если в файле останеться 1000 записей.
  • Мы всегда знаем в каком файле запись с конкретным id.
  • Зная последний id мы всегда знаем со скольких файлов состоит ресурс.

Поддержка, обратная связь, новости

Пишите нам на почту open.source@pllano.com

Вы можете оставлять свои предложения и пожелания в issues, или вы нашли баг в db.json загляните в issues, возможно, про него мы уже знаем и скоро исправим. Если нет, лучше всего сообщить о нём там.

За новостями вы можете следить по
коммитам в этом репозитории.
RSS.

Лицензия db.json

The MIT License (MIT). Please see LICENSE for more information.