Skip to content

ruslan-avantis/structure-db

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

499 Commits
 
 
 
 
 
 
 
 

Repository files navigation

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

Проектирование структуры базы данных важнейшая задача при создании любой 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

"relations" => base64_encode('{
    "product": "all",
    "user": ["phone","email","fname","iname","oname"],
    "address": "all"
}')

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

Глобальные

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

Товары

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

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

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

Корзина

Контент

Технические

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

Установка

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

Глобальные

Цены на сайте

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

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

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

Отзывы

При создании отзыва автоматически создается Тикет, что дает возможность проконтролировать реакцию персонала на отзывы клиентов.

  • review - Отзывы и обзоры
  • comment - Коментарии
  • rating - Рейтинги: отзывов, коментарией итд.

Адреса

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

Товары

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

Маркетинг

ERP

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

API

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

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

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

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

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

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

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

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

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

Результат:

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

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

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

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

$uri_db = "db.json";
if (file_exists($uri_db)){
    // Загрузить файл db.json
    $db = json_decode(file_get_contents($uri_db), true);
    if (count($db) >= 1) {
        // Подключаетесь к базе
        $link = mysqli_connect($host, $user, $password, $database) or die("Ошибка " . mysqli_error($link));
        if (!$link) {exit;}
    
        foreach($db as $table){
            // Если существует колонка table
            if (isset($table["table"])) {
                if (count($table["schema"]) >= 1 && $table["action"] == "create") {
                    $row = ""; 
                    foreach($table["schema"] as $key => $value){
                        if (isset($key) && isset($value)) {
                            if ($key != "id" && preg_match("[a-z0-9_]", $key)) {
                              if ($value == "boolean" || $value == "string" || 
                                $value == "integer" || $value == "double") {
                                // Конвертируем тип
                                $value = str_replace("boolean", "CHAR( 5 ) NOT NULL DEFAULT ''", $value);
                                $value = str_replace("text", "TEXT NOT NULL DEFAULT ''", $value);
                                $value = str_replace("datetime", "DATETIME NOT NULL", $value);
                                $value = str_replace("string", "VARCHAR( 255 ) NOT NULL DEFAULT ''", $value);
                                $value = str_replace("integer", "INT( 11 ) NOT NULL DEFAULT '0'", $value);
                                $value = str_replace("double", "FLOAT( 11, 2 ) NOT NULL DEFAULT '0.00'", $value);
                                $row .= ", ".$key." ".$value;
                            } else {
                                echo "название поля или тип данных не определены";
                            }
                              } else {
                                  echo $key." не прошел проверку preg_match [a-z0-9_]";
                              }
                        } else {
                            echo "value у ".$key." должен иметь один из типов: boolean, string, integer, double";
                        }
                    }
                    
                    if (!mysql_query("SELECT * FROM `".$table["table"]."`")){
                        // Создаем таблицу
                        $query ="CREATE TABLE IF NOT EXISTS ".$table["table"]."(
                            id INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY".$row."
                            )";
                    } else {
                        // Обновляем существующую таблицу
                        $query ="ALTER TABLE ".$table["table"]." 
                            CHANGE id INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY".$row;
                    }
                    // Отправляем запрос
                    mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));
                    
                } else {
                    echo "У ".$table["table"]." отсутствует schema или action != create";
                }
            } else {
                echo "Название одной из таблиц не определено";
            }
        }
        // Закрываем соединение с БД
        mysqli_close($link);
        echo "Создание таблиц прошло успешно";
    return true;
    } else {
        echo "Таблицы в файле db.json не найдены";
        return false;
    }
} else {
    echo "По указанному пути ".$uri_db." файл не найден";
    return false;
}

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

При очень больших файлах ресурсов (свыше 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.

About

Database structure for Standard «APIS-2018»

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors