Skip to content

ruslan-avantis/structure-db

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

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.